私はInputStream、FileInputStream、ByteArrayInputStreamおよびそれらの使用が非常に明確に見える方法(出力ストリームも)。
私が苦労しているのは、FilterInputStream&FilterOutputStreamの使用法を理解することです。
FilterInputStream
は デコレータパターン。 の例です。
このクラスはコンストラクターがprotected
であるため、拡張する必要があります。派生クラスは追加の機能を追加しますが、それでも InputStream
の基本的なインターフェースを公開します。
たとえば、 BufferedInputStream
は、基になる入力ストリームのバッファリングを提供してデータの読み取りを高速化し、 DigestInputStream
はの暗号化ハッシュを計算します。消費されたデータ。
これを使用して、InputStream
またはOutputStream
APIに依存する既存のコードに機能を追加します。たとえば、データをOutputStream
に保存するライブラリを使用するとします。データが大きくなりすぎているため、圧縮を追加する必要があります。データ永続性ライブラリを変更する代わりに、アプリケーションを変更して、現在作成しているストリームを ZipOutputStream
で「装飾」することができます。ライブラリは、圧縮されていない古いバージョンを使用したのと同じようにストリームを使用します。
データのストリームを装飾したいときにそれらを使用します。
これらのストリームクラスインスタンスは、別のストリームインスタンス(これらのいずれかの別のサブクラスであるかどうかに関係なく)をラップし、データが通過するときに、機能を追加し、処理を追加し、データに変更を加えることに注意してください。
たとえば、ストリームから複数のスペースをすべて削除したい場合があります。 FilterInputStreamの独自のサブクラスを作成し、read()
メソッドをオーバーライドします。すべての詳細を気にするつもりはありませんが、サブクラスのメソッドのJavaをいくつか紹介します。
_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;
}
_
実生活では、おそらく他の2つのread()
メソッドも台無しにするでしょう。
その他の用途:
FilterInputStream および FilterOutputStream は、独自の入出力ストリームを実装したい開発者の仕事を容易にするためにあります。 BufferedInputStream などの実装では、InputStream
クラス(この場合はFilteredInputStream)を委任しながら、基本的なsuper
APIの周りに独自の装飾を追加できます-必要のないメソッドオーバーライドします。
FilterInputStream
もFilterOutputStream
も、エンドユーザーが直接使用できるようには設計されていません。