わかりました。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);
おそらく、ファイルに書き込みたいので、FileWriter
を使用しています。 BufferedWriter
とPrintWriter
の両方に、書き込むための別のライターを指定する必要があります-必要ですsome最終的な宛先。
(個人的には、エンコーディングを指定できないため、FileWriter
は好きではありません。FileOutputStream
でラップされたOutputStreamWriter
を使用することを好みますが、それは別の問題です。 )
BufferedWriter
は、あなたが言うように、バッファリングに使用されます-バッファリングはしませんがall出力は、固定量(バッファのサイズ)だけです。基になるライターへの「チャンキー」な書き込みを作成します。
PrintWriter
の使用に関しては、まあ、それはprintln
のようないくつかの追加のメソッドを公開します。個人的には、例外を飲み込むので嫌いです(checkError
で明示的に確認する必要がありますが、それでも詳細はわかりませんが、使用されているとは思われませんever )、しかし再びそれはあなたがしていることに依存します。 PrintWriter
は、BufferedWriter
をits宛先として渡されます。
したがって、表示したセクションの下のコードは、おそらくPrintWriter
に書き込み、BufferedWriter
に書き込み、(バッファがいっぱいになるか、フラッシュまたはクローズされると)書き込みます。 FileWriter
に変換します。これにより、文字データがディスク上のバイトに変換されます。
Docs から:
一般に、ライターはその出力を基になる文字またはバイトストリームにすぐに送信します。プロンプト出力が必要でない限り、FileWritersやOutputStreamWritersなど、write()操作にコストがかかる可能性のあるWriterの周りにBufferedWriterをラップすることをお勧めします。例えば、
_ PrintWriter out = new PrintWriter(new BufferedWriter(new FileWriter("foo.out")));
_
printWriterの出力をファイルにバッファリングします。バッファリングがないと、print()メソッドを呼び出すたびに文字がバイトに変換され、すぐにファイルに書き込まれるため、非常に非効率になる可能性があります。
このことから、BufferedWriter
が効率的な書き込み方法であることが理解できます。
単一の文字、配列、および文字列の効率的な書き込みを提供するために、文字をバッファリングして、文字出力ストリームにテキストを書き込みます。
ここでの目的はFileWriter
を使用して出力ファイルに書き込むことであるため、BufferedWriter
オブジェクトはBufferedWriter
に渡されます。
そして最後に、PrintWriter
はprintln()
のような_print*
_メソッドに使用されます。
FileWriter
は、(フォーマットせずに)プレーンテキストを書き込むためのものであり、書き込み方法が何であれ、バッファメカニズムを使用しません。
BufferedWriter
はWriter
クラスのラッパーであり、バッファー機能を使用できるようにします(IOを最適化するため)。
PrintWriter
はフォーマットされたテキストを印刷し、印刷するデータとともにフォーマット文字列を提供できますが、バッファリングを提供するために、任意のWriter/OutputStream
と直接連携でき、Writer/OutputStream
は最初に渡されますBufferedWriter
次に、フォーマットされたテキストがPrintWriter
に渡されます
PrintWriter from here
オブジェクトのフォーマットされた表現をテキスト出力ストリームに出力します。このクラスは、PrintStreamにあるすべての印刷メソッドを実装します。プログラムがエンコードされていないバイトストリームを使用する必要がある生のバイトを書き込むためのメソッドは含まれていません。
上記のステートメントから、PrintWriterを使用する主な理由は、println()
、println(char [] x)
などのPrintStream
のすべてのメソッドにアクセスするためであると思われます。
BufferedWriter、その通りです。ファイルに直接書き込む前に文字を仮想メモリにバッファリングし、newLine()
メソッドを考え出すので、ファイルに書き込むための最良の方法の1つです。
FileWriter from here
FileWriterは、文字のストリームを書き込むためのものです。生のバイトのストリームを書き込む場合は、FileOutputStreamの使用を検討してください
。
通常、この種のライターチェーンは抽象化に関するものです。 PrintWriter
いくつかの便利なprint
メソッドとprintln
メソッドがあり、文字列と行をファイルに出力する場合に便利です。 FileWriter
を直接操作するには、より「低レベル」のAPIを使用する必要があります。そして、あなたが言うように、BufferedWriter
はバッファリングについてです。したがって、基本的には、ファイルに何を出力するか、およびどのレベルの抽象化を好むかが問題になります。
より洗練されたフォーマットのために最も外側のPrintWriterを使用したいので、オブジェクトはこの順序でラップされます。 BufferedWriterは何かにラップする必要があります。したがって、FileWriterは、結果として、BufferedWriterがラップするものであり、最も内側のオブジェクトです。