75

それらの違いは何ですか?私はJavaATMを学んでいますが、ファイルに両方の方法で書き込むことができるようです(つまり、ここでは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回書き込むということですか?

4

6 に答える 6

87

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

于 2012-09-10T11:05:53.503 に答える
8

あなたが正しいです。外観の方法は次のとおりですwrite()BufferedWriter

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;)。

于 2012-09-10T11:01:53.730 に答える
5

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

于 2012-09-10T11:00:18.630 に答える
0

Java API仕様から:

FileWriter

文字ファイルを書くためのコンビニエンスクラス。このクラスのコンストラクターは、デフォルトの文字エンコードとデフォルトのバイトバッファーサイズが受け入れ可能であることを前提としています。

BufferedWriter

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

于 2012-09-10T11:04:54.900 に答える
0

http://docs.oracle.com/javase/1.5.0/docs/api/java/io/BufferedWriter.html

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

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

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

于 2012-09-10T11:05:14.273 に答える
0

バッファリングされていないInput/Output(FileWriter、FileReader)では、読み取りまたは書き込み要求は基盤となるOSによって直接処理されます。https://hajsoftutorial.com/java/wp-content/uploads/2018/04/Unbuffered.gif

これにより、プログラムの効率が大幅に低下する可能性があります。これは、このような各要求が、ディスクアクセス、ネットワークアクティビティ、または比較的コストのかかるその他の操作をトリガーすることが多いためです。この種のオーバーヘッドを減らすために、JavaプラットフォームはバッファリングされたI/Oストリームを実装します。BufferedReaderクラスとBufferedWriterクラスは、内部文字バッファーを提供します。バッファリングされたライターに書き込まれたテキストは内部バッファに格納され、バッファがいっぱいになるかフラッシュされたときにのみ、基になるライターに書き込まれます。 https://hajsoftutorial.com/java/wp-content/uploads/2018/04/bufferedoutput.gif

詳細https://hajsoftutorial.com/java-bufferedwriter/

于 2018-05-11T17:53:04.017 に答える