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.
OK, ale BufferedInputStream i DigestInputStream faktycznie robią coś ze strumieniem bazowym. Do czego służy funkcja FilterInputStream? – ed22