1. ホーム
  2. java

FileWriterとBufferedWriterのJavaの違い

2023-12-09 17:17:10

質問

それらの違いは何ですか?私はJava ATMを学んだばかりですが、私は両方の方法すなわちファイルに書き込むことができるように思えます(私はここでtry-catchブロックをコピーしませんでした)。

FileWriter file = new FileWriter("foo.txt");
file.write("foobar");
file.close();

FileWriter file = new FileWriter("foo.txt");
BufferedWriter bf = new BufferedWriter(file);
bf.write("foobar");
bf.close();

データを先にバッファリングするという概念は理解できたので、最初の例では文字を1つずつ書き込み、2番目の例ではそれをメモリにバッファリングして一度書き込むということでしょうか?

どのように解決するのですか。

BufferedWriterは、以下のような場合、より効率的です。

  • フラッシュ/クローズ間に複数の書き込みがある
  • バッファサイズに比べ書き込みが小さい。

あなたの例では、書き込みは一回だけなので、BufferedWriterは必要ないオーバーヘッドを追加するだけです。

ということは、最初の例では文字を一つずつ書き込み、2番目の例ではメモリにバッファリングして一度だけ書き込むということでしょうか?

どちらの場合も、文字列は一度に書き込まれます。

FileWriterだけを使っている場合、write(String)の呼び出しは

 public void write(String str, int off, int len) 
        // some code
        str.getChars(off, (off + len), cbuf, 0);
        write(cbuf, 0, len);
 }

これは、write(String)の呼び出しごとに、1つのシステムコールを行います。


BufferedWriterが効率を向上させるのは、複数の小さな書き込みの場合です。

for(int i = 0; i < 100; i++) {
    writer.write("foorbar");
    writer.write(NEW_LINE);
}
writer.close();

BufferedWriter を使用しないと、200 (2 * 100) 回のシステムコールとディスクへの書き込みが発生し、非効率的です。BufferedWriter を使用すると、これらはすべて一緒にバッファリングされ、デフォルトのバッファ サイズが 8192 文字であるため、書き込みのためのシステム コールは 1 回だけとなります。