ファイルへの書き込み中、閉じる前に、flush()??を含めるべきかという疑問があります。もしそうなら、それは正確に何をしますか?自動フラッシュをストリームしない??編集:
それで、それが実際に何をするのかをフラッシュしますか?
ライターとストリームは通常、出力データの一部をメモリにバッファーし、一度により大きなブロックに書き込もうとします。フラッシュすると、バッファからディスクに即座に書き込みが行われるため、プログラムがクラッシュしてもデータは失われません。もちろん、ディスクが物理的にデータをすぐに書き込むことができないため、データが失われる可能性があるため、保証はありません。しかし、それはJavaプログラムのせいではありません):)
PrintWritersは、行末を書き込むと(デフォルトでは)自動フラッシュします。もちろん、ストリームとバッファを閉じるとフラッシュします。それ以外は、バッファがいっぱいになったときにのみフラッシュが行われます。
閉じる前にフラッシュを呼び出すことを強くお勧めします。基本的には、残りのバッファされたデータをファイルに書き込みます。
flush
を明示的に呼び出すと、IOException
からのclose
が本当に壊滅的であり、システムリソースの解放に関連していると確信できます。
自分でflush
を実行すると、データ書き込み例外を処理するのと同じ方法でIOException
を処理できます。
Close()がフラッシュを実行するため、フラッシュを実行する必要はありません。
Javadocから:
「ストリームを閉じて、最初にフラッシュします。ストリームを閉じた後、さらにwrite()またはflush()を呼び出すと、IOExceptionがスローされます。ただし、以前に閉じたストリームを閉じても効果はありません。」
フラッシュが実際に何を行うかについての質問に答えるために、ストリームに書き込んだもの(ケースではファイル)が実際にそのファイルに書き込まれるようにします。
Javaはバッファリングを実行できます。つまり、Javaはメモリに書き込まれたデータを一定の量になるまで保持し、すべてを一度にファイルに書き込む方が効率的です。これの欠点は、ファイルが常に最新であるとは限らないことです。フラッシュは、「ファイルを最新の状態にします。
Close呼び出しは、最初にフラッシュして、ファイルを閉じた後、ファイルに表示されることが予想されるものになるようにします。そのため、他の人が指摘したように、閉じる前にフラッシュする必要はありません。
閉じると自動的にフラッシュします。呼び出す必要はありません。
他の人が言ったように、close()の直前にflush()を呼び出す意味はありません。 flush()を使用するのは、ファイルを開いたままにしているが、以前の書き込みが完全に完了していることを確認したい場合です。
FileWriter
は、明示的な文字セットを取得するのではなく、偶然そこにある文字セットを取得するため、悪質なクラスです。デフォルトが必要な場合でも、それを明確にしてください。
通常の解決策はOutputStreamWriter
とFileOutputStream
です。デコレータが例外をスローする可能性があります。したがって、ライターが構築されていなくても、ストリームを閉じることができる必要があります。これを行う場合は、ライターをフラッシュして(ハッピーケースの場合)、常にストリームを閉じるだけです。 (混乱を招くだけですが、たとえばzipを処理するためのデコレータには、閉じる必要があるリソースがあります。)
前述のように、通常はフラッシュする必要はありません。
何らかの理由で、別のプロセスが作業中のファイルを閉じずに完全な内容を表示したい場合にのみ意味があります。たとえば、複数のプロセスによって同時に変更されるファイルに使用できますが、注意が必要です:-)
プログラムでフラッシュするもう1つの使用例は、長時間実行ジョブの進行状況をファイルに書き込むことです(そのため、停止して後で再起動できます。データがドライブ上で安全であることを確認したい場合があります。
while (true) {
computeStuff();
progresss += 1;
out.write(String.format("%d", progress));
out.flush();
}
out.close();