web-dev-qa-db-ja.com

Java:FilterInputStream他のストリームと比較した場合の利点と使用法

私はInputStreamFileInputStreamByteArrayInputStreamおよびそれらの使用が非常に明確に見える方法(出力ストリームも)。

私が苦労しているのは、FilterInputStream&FilterOutputStreamの使用法を理解することです。

  • 他のストリームクラスと比較して、それを使用する利点は何ですか?
  • いつ使うべきですか?
  • 理論的な説明と基本的な例を提供してください。
18
Luther

FilterInputStreamデコレータパターン。 の例です。

このクラスはコンストラクターがprotectedであるため、拡張する必要があります。派生クラスは追加の機能を追加しますが、それでも InputStream の基本的なインターフェースを公開します。

たとえば、 BufferedInputStream は、基になる入力ストリームのバッファリングを提供してデータの読み取りを高速化し、 DigestInputStream はの暗号化ハッシュを計算します。消費されたデータ。

これを使用して、InputStreamまたはOutputStreamAPIに依存する既存のコードに機能を追加します。たとえば、データをOutputStreamに保存するライブラリを使用するとします。データが大きくなりすぎているため、圧縮を追加する必要があります。データ永続性ライブラリを変更する代わりに、アプリケーションを変更して、現在作成しているストリームを ZipOutputStream で「装飾」することができます。ライブラリは、圧縮されていない古いバージョンを使用したのと同じようにストリームを使用します。

18
erickson

データのストリームを装飾したいときにそれらを使用します。

これらのストリームクラスインスタンスは、別のストリームインスタンス(これらのいずれかの別のサブクラスであるかどうかに関係なく)をラップし、データが通過するときに、機能を追加し、処理を追加し、データに変更を加えることに注意してください。

たとえば、ストリームから複数のスペースをすべて削除したい場合があります。 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()メソッドも台無しにするでしょう。

その他の用途:

  • ストリームを流れるすべてのものをログに記録します
  • 'tee'ユーティリティを複製して、読み取られるストリームが2つの方法で処理されるようにします。
  • Windows、Mac、Unix/Linux形式の間で行末を変換する
  • 遅延を追加して、モデムやシリアルポート、ワイヤレスネットワーク接続などの低速の伝送方法をシミュレートします。
3
Lee Meador

FilterInputStream および FilterOutputStream は、独自の入出力ストリームを実装したい開発者の仕事を容易にするためにあります。 BufferedInputStream などの実装では、InputStreamクラス(この場合はFilteredInputStream)を委任しながら、基本的なsuperAPIの周りに独自の装飾を追加できます-必要のないメソッドオーバーライドします。

FilterInputStreamFilterOutputStreamも、エンドユーザーが直接使用できるようには設計されていません。

0
George Aristy