32

ファイルへの書き込み中、閉じる前に、flush()?? を含める必要があるという質問があります。もしそうなら、それは正確に何をしますか?自動フラッシュをストリーミングしないでください?? 編集:

それで、それは実際に何をするのですか?

4

9 に答える 9

25

ライターとストリームは通常、出力データの一部をメモリにバッファリングし、一度に大きなブロックに書き込もうとします。フラッシュすると、バッファからディスクにすぐに書き込まれるため、プログラムがクラッシュしても、そのデータは失われません。もちろん、ディスクがデータをすぐに物理的に書き込まない可能性があるため、保証はありません。そのため、データが失われる可能性があります。しかし、それはJavaプログラムのせいではありません:)

PrintWritersは、行末を書き込むときに(デフォルトで)自動フラッシュします。もちろん、ストリームとバッファーを閉じると、フラッシュします。それ以外は、バッファがいっぱいになったときにのみフラッシュが行われます。

于 2009-11-16T14:31:51.053 に答える
22

閉じる前にフラッシュを呼び出すことを強くお勧めします。基本的に、残りのバッファリングされたデータをファイルに書き込みます。

flush明示的に呼び出すと、システム リソースの解放に関連する非常に壊滅的なIOException結果になる可能性があります。close

flush自分で行う場合は、IOExceptionデータ書き込み例外を処理するのと同じ方法で処理できます。

于 2009-11-16T15:00:51.043 に答える
13

close() がフラッシュを実行するため、フラッシュを実行する必要はありません。

javadoc から:

「ストリームを閉じて、最初にフラッシュします。ストリームが閉じられると、さらに write() または flush() を呼び出すと、IOException がスローされます。ただし、以前に閉じたストリームを閉じても効果はありません。」

于 2009-11-16T14:05:32.653 に答える
4

フラッシュが実際に何をするかについての質問に答えるために、ストリームに書き込んだもの(この場合はファイル)が実際にそのファイルに書き込まれることを確認します。

Javaはバッファリングを実行できます。つまり、メモリに書き込まれたデータが一定量になるまで保持され、その後、すべてを一度にファイルに書き込むので、より効率的です。これの欠点は、ファイルが常に最新であるとは限らないことです。フラッシュは、「ファイルを最新の状態にする」という言い方です。

Close呼び出しは最初にフラッシュして、ファイルを閉じた後、期待どおりのファイルが含まれるようにします。したがって、他の人が指摘しているように、閉じる前にフラッシュする必要はありません。

于 2009-11-16T14:31:02.930 に答える
3

閉じると自動的にフラッシュします。呼び出す必要はありません。

于 2009-11-16T14:05:26.427 に答える
1

他の人が言っているように、close()の直前にflush()を呼び出す意味はありません。flush()を使用するのは、ファイルを開いたままにしているが、以前の書き込みが完全に完了していることを確認したい場合です。

于 2009-11-16T14:16:00.027 に答える
1

FileWriter明示的な文字セットを使用するのではなく、そこにある文字セットをすべて取得するため、は邪悪なクラスです。デフォルトが必要な場合でも、それについて明示してください。

通常の解決策はとOutputStreamWriterですFileOutputStream。デコレータが例外をスローする可能性があります。したがって、ライターが作成されていない場合でも、ストリームを閉じることができる必要があります。これを行う場合は、ライターをフラッシュし(幸せな場合)、常にストリームを閉じるだけで済みます。(紛らわしいことに、たとえばzipを処理するための一部のデコレータには、閉じる必要のあるリソースがあります。)

于 2009-11-16T19:14:08.597 に答える
1

前述のとおり、通常はフラッシュする必要はありません。

なんらかの理由で、作業中のファイルを閉じずに別のプロセスに完全な内容を表示させたい場合にのみ意味があります。たとえば、多くの注意が必要ですが、複数のプロセスによって同時に変更されるファイルに使用できます:-)

于 2009-11-16T14:37:24.833 に答える
1

プログラムでのフラッシュのもう 1 つの使用例は、実行時間の長いジョブの進行状況をファイルに書き込むことです (後で停止して再開できるようにするためです。データがドライブ上で安全であることを確認する必要があります。

while (true) {
  computeStuff();
  progresss += 1;
  out.write(String.format("%d", progress));
  out.flush();
}
out.close();
于 2013-10-22T07:49:38.757 に答える