2013-07-05 13 views
14

Czytałem na InputStream, FileInputStream, ByteArrayInputStream i jak ich zastosowanie wydaje się całkiem jasne strumienie wyjściowe (zbyt).Java: FilterInputStream Jakie są zalety i zastosowanie w porównaniu do innych strumieni

Co mam zmaga jest zrozumieć wykorzystanie FilterInputStream & FilterOutputStream:

  • Co jest zaletą używania to w porównaniu do innych klas strumienia?
  • Kiedy należy z niego korzystać?
  • Proszę podać teoretyczne wyjaśnienie i podstawowy przykład.

Odpowiedz

18

FilterInputStream jest przykładem the Decorator pattern.

Klasa ta musi zostać przedłużony, ponieważ jego konstruktor jest protected. Klasa pochodna dodawałaby dodatkowe możliwości, ale nadal eksponuje podstawowy interfejs InputStream.

Na przykład: BufferedInputStream zapewnia buforowanie podstawowego strumienia wejściowego w celu przyspieszenia odczytu danych, a DigestInputStream wylicza kryptograficzny skrót danych w trakcie jego pobierania.

Można tego użyć, aby dodać funkcjonalność do istniejącego kodu, który zależy od interfejsu API InputStream lub OutputStream. Załóżmy na przykład, że używasz pewnej biblioteki, która zapisuje dane do OutputStream. Dane rosną zbyt duże, więc chcesz dodać kompresję. Zamiast modyfikować bibliotekę trwałości danych, można zmodyfikować aplikację tak, aby "dekorowała" strumień, który obecnie tworzy za pomocą ZipOutputStream. Biblioteka będzie używać strumienia tak samo, jak w starej wersji bez kompresji.

+0

OK, ale BufferedInputStream i DigestInputStream faktycznie robią coś ze strumieniem bazowym. Do czego służy funkcja FilterInputStream? – ed22

3

Używa się ich, gdy chcemy ozdobić strumień danych.

Należy pamiętać, że te instancje klasy stream zawijają się wokół innej instancji strumienia (niezależnie od tego, czy jest to inna podklasa jednego z nich) i dodają jakąś funkcję, dodają przetwarzanie, wprowadzają pewne zmiany w danych podczas ich przechodzenia.

Na przykład możesz chcieć usunąć wszystkie spacje z pewnego strumienia. Tworzysz własną podklasę FilterInputStream i zastępujesz metodę read(). Nie zamierzam się przejmować wszystkie szczegóły, ale tutaj jest trochę sorta-java dla metody w podklasie:

private boolean lastWasBlank = false; 
public int read() { 
    int chr = super.read(); 
    if (chr == ' ') { 
     if (lastWasBlank) { 
      return read(); 
     } else { 
      lastWasBlank = true; 
     } 
    } else { 
     lastWasBlank = false; 
    } 
    return chr; 
} 

W prawdziwym życiu, prawdopodobnie bałagan z dwoma read() innymi metodami też.

innych zastosowań:

  • Log wszystko przepływające przez strumień
  • Powiel „tee” użyteczność więc strumień odczytywany jest obsługiwane na dwa sposoby.
  • Konwersja końcówek linii między systemami Windows, Mac i Unix/Linux
  • Dodaj opóźnienia do symulacji wolnych metod transmisji, takich jak modemy, porty szeregowe lub połączenia sieci bezprzewodowej.
+0

FilterInputStream nie robi nic, aby pomóc zaimplementować strumień, który filtruje dane i poprawnie obsługuje 'mark',' available', itp. Czy znasz klasę podstawową, która faktycznie pomogłaby w implementowaniu dekoratora strumienia wejściowego? –

Powiązane problemy