19

I/O について学んでいるところですが、スライドの 1 つで次のコードを見つけました。FileWrite、BufferedWriter、および PrintWriter が必要な理由を誰か説明してもらえますか? BufferedWriter が出力をバッファリングして一度にすべて入れることは知っていますが、なぜ FileWriter と PrintWriter を使用するのでしょうか? エラー処理などに少し違いがありますが、ほとんど同じことをしませんか?

また、なぜ彼らはに渡すbwのですPrintWriterか?

      FileWriter fw = new FileWriter (file);
      BufferedWriter bw = new BufferedWriter (fw);
      PrintWriter outFile = new PrintWriter (bw);
4

6 に答える 6

27

おそらくFileWriter、ファイルに書き込みたいので、を使用しています。どちらもBufferedWriterPrintWriter書き込み先の別のライターを指定する必要があります。最終的な宛先が必要です。

(個人的には、エンコーディングを指定できないので好きFileWriterではありません。私はFileOutputStreamラップされたを使用することを好みますOutputStreamWriterが、それは別の問題です。)

BufferedWriterあなたが言うように、バッファリングに使用されます-すべての出力をバッファリングするわけではありませんが、固定量(バッファのサイズ)だけです。基礎となるライターへの「分厚い」書き込みを作成します。

-の使用に関しては、PrintWriterなどの追加のメソッドが公開されprintlnます。個人的には、例外を飲み込むので嫌いです( で明示的に確認する必要がありますがcheckError、それでも詳細は表示されず、使用されたことはないと思います。は宛先としてPrintWriter渡さBufferedWriterます

したがって、あなたが示したセクションの下のコードは、おそらくにPrintWriter書き込みBufferedWriterますFileWriter.ディスク上のバイト。

于 2013-04-04T05:51:41.160 に答える
8

ドキュメントから:

一般に、Writer はその出力を基になる文字ストリームまたはバイト ストリームにすぐに送信します。迅速な出力が必要でない限り、FileWriters や OutputStreamWriters など、write() 操作にコストがかかる可能性のある Writer を BufferedWriter でラップすることをお勧めします。例えば、

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

PrintWriter の出力をファイルにバッファリングします。バッファリングがないと、print() メソッドを呼び出すたびに文字がバイトに変換され、すぐにファイルに書き込まれるため、非常に非効率的です。

このことから、 aBufferedWriterが効率的な書き方であることが理解できます。

テキストを文字出力ストリームに書き込み、文字をバッファリングして、単一の文字、配列、および文字列を効率的に書き込むことができるようにします。

ここでの目的は、 を使用して何らかの出力ファイルに書き込むことであるためFileWriter、 オブジェクトが に渡されます。BufferedWriterBufferedWriter

最後に、 aは のようなメソッドにPrintWriter使用されます。print*println()

于 2013-04-04T05:52:18.727 に答える
2

FileWriter単純にプレーンテキストを(フォーマットなしで)書き込むことです。バッファメカニズムは使用しません。書き込むだけです。

BufferedWriterWriterクラスがバッファ機能を使用できるようにするためのラッパーです(IOを最適化するため)。

PrintWriterフォーマットされたテキストを印刷します。印刷するデータとともにフォーマット文字列を指定できますが、バッファリングを提供するためだけに任意の を直接操作できWriter/OutputStreamます。Writer/OutputStreamBufferedWriterPrintWriter

于 2013-04-04T05:50:17.607 に答える
1

通常、この種の Writer チェーンは抽象化に関するものです。PrintWriter文字列と行をファイルに出力する場合に便利ないくつかの便利なprintメソッドprintlnがあります。を直接操作するFileWriterには、より「低レベル」の API を使用する必要があります。そして、あなたが言うようBufferedWriterに、バッファリングについてです。したがって、基本的には、ファイルに何を出力したいか、どのレベルの抽象化を優先するかが問題になります。

于 2013-04-04T05:50:00.157 に答える