web-dev-qa-db-ja.com

FileWriteBufferedWriterとPrintWriterの組み合わせ

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

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

      FileWriter fw = new FileWriter (file);
      BufferedWriter bw = new BufferedWriter (fw);
      PrintWriter outFile = new PrintWriter (bw);
18
Ahoura Ghotbi

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

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

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

PrintWriterの使用に関しては、まあ、それはprintlnのようないくつかの追加のメソッドを公開します。個人的には、例外を飲み込むので嫌いです(checkErrorで明示的に確認する必要がありますが、それでも詳細はわかりませんが、使用されているとは思われませんever )、しかし再びそれはあなたがしていることに依存します。 PrintWriterは、BufferedWriterits宛先として渡されます。

したがって、表示したセクションの下のコードは、おそらくPrintWriterに書き込み、BufferedWriterに書き込み、(バッファがいっぱいになるか、フラッシュまたはクローズされると)書き込みます。 FileWriterに変換します。これにより、文字データがディスク上のバイトに変換されます。

24
Jon Skeet

Docs から:

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

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

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

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

単一の文字、配列、および文字列の効率的な書き込みを提供するために、文字をバッファリングして、文字出力ストリームにテキストを書き込みます。

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

そして最後に、PrintWriterprintln()のような_print*_メソッドに使用されます。

6
user2032663

FileWriterは、(フォーマットせずに)プレーンテキストを書き込むためのものであり、書き込み方法が何であれ、バッファメカニズムを使用しません。

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

PrintWriterはフォーマットされたテキストを印刷し、印刷するデータとともにフォーマット文字列を提供できますが、バッファリングを提供するために、任意のWriter/OutputStreamと直接連携でき、Writer/OutputStreamは最初に渡されますBufferedWriter次に、フォーマットされたテキストがPrintWriterに渡されます

2
Ankit

PrintWriter from here

オブジェクトのフォーマットされた表現をテキスト出力ストリームに出力します。このクラスは、PrintStreamにあるすべての印刷メソッドを実装します。プログラムがエンコードされていないバイトストリームを使用する必要がある生のバイトを書き込むためのメソッドは含まれていません。

上記のステートメントから、PrintWriterを使用する主な理由は、println()println(char [] x)などのPrintStreamのすべてのメソッドにアクセスするためであると思われます。

BufferedWriter、その通りです。ファイルに直接書き込む前に文字を仮想メモリにバッファリングし、newLine()メソッドを考え出すので、ファイルに書き込むための最良の方法の1つです。

FileWriter from here

FileWriterは、文字のストリームを書き込むためのものです。生のバイトのストリームを書き込む場合は、FileOutputStreamの使用を検討してください

2
subodh

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

1
NilsH

より洗練されたフォーマットのために最も外側のPrintWriterを使用したいので、オブジェクトはこの順序でラップされます。 BufferedWriterは何かにラップする必要があります。したがって、FileWriterは、結果として、BufferedWriterがラップするものであり、最も内側のオブジェクトです。

0