web-dev-qa-db-ja.com

Java FileWriterとBufferedWriterの違い

それらの違いは何ですか?私はただ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番目の最初の例では文字をメモリにバッファリングしてから1回書き込みます。

64
Opi

次の場合、BufferedWriterはより効率的です。

  • フラッシュ/クローズ間に複数の書き込みがあります
  • 書き込みはバッファサイズに比べて小さくなります。

この例では、書き込みは1つしかないため、BufferedWriterは必要のないオーバーヘッドを追加するだけです。

したがって、最初の例では文字を1つずつ書き込み、2番目の最初の例では文字をメモリにバッファリングして1回書き込みます

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

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つのシステムコールになります。

80
Peter Lawrey

あなたが正しいです。 BufferedWriterwrite()メソッドの外観は次のとおりです。

public void write(int c) throws IOException {
    synchronized (lock) {
        ensureOpen();
        if (nextChar >= nChars)
            flushBuffer();
        cb[nextChar++] = (char) c;
    }
}

ご覧のとおり、実際にバッファがいっぱいかどうか(if (nextChar >= nChars))をチェックし、バッファをフラッシュします。次に、新しい文字をバッファに追加します(cb[nextChar++] = (char) c;)。

8
AlexR

BufferedWriterはより効率的です。メモリが適切に機能する場合、小さな書き込みを節約し、1つの大きなチャンクに書き込みます。多くの小さな書き込みを行っている場合は、BufferedWriterを使用します。 OSへの書き込み呼び出しの呼び出しは遅いため、可能な限り書き込みをできるだけ少なくすることが通常望ましいです。

4
RNJ

Java AP​​I仕様から:

FileWriter

文字ファイルを書くための便利なクラス。このクラスのコンストラクタは、デフォルトの文字エンコーディングとデフォルトのバイトバッファサイズが受け入れ可能であると想定しています。

BufferedWriter

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

0
Magicode

http://docs.Oracle.com/javase/1.5.0/docs/api/Java/io/BufferedWriter.html

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

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

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

0
Ilia Nedoluzhko