File.deleteOnExit()は、JVMが途中で強制終了された場合でも、ファイルが削除されることを保証しますか?
2 に答える
Tim Benderが指摘File.deleteOnExit()
しているように、ファイルが実際に削除されることを保証するものではありません。
ただし、Unixishシステム(LinuxやOSXなど)では、一時ファイルに書き込む前に(ただし、開いた後に)一時ファイルを削除することができます。ファイルに対して開いた記述子を保持している限り、ファイルがディレクトリツリーに存在しなくなった場合でも、ファイルの読み取りと書き込みを正常に続行できます。OSは、ファイルが使用したスペースを自動的に再利用します。プログラムが終了します(またはファイルの最後の記述子を閉じます)。
これは、ファイルシステムのセマンティクスが異なり、開いているファイルを削除できないWindowsでは機能しません。ただし、ポータブルコードでは、ファイルを開いた後でファイルを削除してみて、それが成功しない場合は、次の手順にフォールバックできますdeleteOnExit()
。
File tempFile = File.createTempFile("tempfile", ".tmp");
RandomAccessFile fh = new RandomAccessFile (tempFile, "rw");
// try to delete the file now, fall back to deletion on exit
if ( !tempFile.delete() ) tempFile.deleteOnExit();
明らかに、File.deleteOnExit()
Windowsではあまり信頼できないことに注意してください。したがって、可能な場合はいつでも、一時ファイルを使い終わったら、手動で閉じて削除するようにしてください。詳細については、私が別の質問に書いたこの回答を参照してください。
削除は、Java言語仕様で定義されているように、仮想マシンの通常の終了に対してのみ試行されます。
いいえ。可能であれば、次回の起動時にファイルを確認してください。