2012-02-22 14 views
2

私のアプリでは、実行情報を保存するファイルを作成しています。実行が完了すると、一時ファイルを削除します。ファイルが閉じられたり、ストリームでフラッシュされたりしても問題は解決しません。ファイルを削除できません。試してみましたJavaファイルの削除とSystem.gc()

Thread.sleep(1000); 
file.delete(); 

このファイルも削除されませんでした。私はその後、whileループを作成しました

永遠にループしていました。私はそれを加えた

System.gc(); 
file.delete(); 

それは働いた!

私はファイルを正常に閉じたり、フラッシュしたことを確認しました。私のコードがSystem.gc()と一緒に働いた理由を知りたいですか?

+6

ファイルを削除する前に、開いているファイルストリームをすべて閉じてください。 – mre

+0

それでも、本当です。 Windows関連のバグJDK-4715154です。 Scalaランタイムライブラリに特別な 'scala.compat.Platform.collectGarbage()'エントリがあるのはおそらくそうでしょう。 – Epicurist

答えて

3

これは、あなたがclose()に電話しなかったことを示しているようです。

理由:のjavaの開始時に、Object.finalize()方法は、ガベージコレクションにクリーンアップするために使用された、およびI/Oのためにそれはclose()をしました。

ファイルが使用中(閉じていない)になるまで、Windowsではファイルを削除できません。

0

使用するものはFile.createTempFile()で、結果のファイルにはdeleteOnExit()と記載されています。実行の終了時に一時ファイルのクリーンアップを管理します。これを手動で行うべきではありません。システムがこれを行うようにしてください。そのため、標準ライブラリにこれを組み込んでいます。

また、.close()に電話して、すべてのデータがファイルにフラッシュされ、ハンドルを正しくクリーンアップできることを確認する必要があります。

+1

File.createTempFile()はクリーンアップ作業を行いません。 tempディレクトリに一意の名前を持つファイルを作成するだけです。アプリケーションは、ファイルの処理が完了した時点でファイルを削除する必要があります。 –

関連する問題