1
BufferedWriter out = new BufferedWriter( new OutputStreamWriter( new BufferedOutputStream( new FileOutputStream("out.txt") ) ) );

これを理解しているかどうか見てみましょう: ファイル「out.txt」のバイト出力ストリームが開かれます。次に、ファイル操作を高速化するために、バッファリングされた出力ストリームに供給されます。バッファリングされたストリームは出力ストリーム ライターに送られ、バイトから文字にブリッジされます。最後に、このライターはバッファリングされたライターに供給されます...これにより、バッファリングの別のレイヤーが追加されますか?

うーん...

4

2 に答える 2

3

はい。それで合っています。

この場合、もっと短くできると思います(BufferedWriterも参照)

BufferedWriter out = new BufferedWriter(new FileWriter("foo.out"));

または、優れた印刷機能が必要な場合:

PrintWriter out = new PrintWriter(new BufferedWriter(new FileWriter("foo.out")));

FileWriterが独自のラッピングを作成する可能性がありますが、そのクラスはどの方法が最適かを認識しています。

Java では Streams と Writers はラッパーであるため、必要に応じてそれらを組み立てることができます (それらを積み重ねることによって)。クラスは、スタックするストリーム/ライターのタイプを調べません。あなたの場合、複数のバッファがあるということは、実際には 2 つの異なるクラスに 2 つのバッファがあることを意味します。これは、余分なメモリを消費し、パフォーマンスが低下する可能性があることを意味しますが、ほとんどの場合、これに気付くことはありません (他のパフォーマンス要因と比較してわずかなオーバーヘッドであるため)。

于 2010-02-11T09:37:41.153 に答える
0

これはデコレータパターンの例です。アイデアは、クラスを変更せずにクラスに機能を追加することです。あなたの例では、FileWriterがあります。書き込む前に、最初に書き込んだものをバッファリングする必要があります(ネットワーク経由の場合は良い考えです)。したがって、FileWriterの上にBufferedWriterを重ねます。他のアプリはデータのバッファリングを望まない場合があるため、開発者はBufferedWriterを追加する必要はありません。

すべての開発者が何を必要とするかを予測することはできません。データをrot13する必要があるとしましょう。ここで、FileWriterを変更する代わりに、Writerを実装するRot13Writerというクラス呼び出しを作成します。Rot13WriterはWriterのインスタンスを取得し、次のライターに渡す前にrot13を実行します。

于 2010-04-12T03:42:22.610 に答える