deleteOnExit()メソッドは環境によって動作が違う JVM+Windows

Java Virtual Machine(JVM)は環境に依存せず、同じコードがどの環境でも同じように動作する設計となっています。
しかし環境依存のコードが使用されているところでは、振る舞いが異なることがあります。

deleteOnExit()メソッドはそれに該当します。
『ファイルが存在したら削除する』というメソッドです。

deleteOnExit()メソッド自体は本来JVMを終了させるときに、不要なファイルを削除するために用意されたものです。
しかし、このメソッドを使ってファイルを削除するように指定してもWindowsでは削除されないことがあります。

スポンサーリンク

原因はJavaの2つのバグによるもので、
バグ番号4171239「java.io.File.deleteOnExitは、オープン状態のファイルに対しては動作しません(win32)」
JVMデザインとWin32オペレーティングシステムの組み合わせでは、オープン状態のファイルを終了時に削除することができません。

そこで終了前にすべてのファイルを閉じておけば削除されるかというとそうではありません。

バグ番号4950148「ClassLoaderの使用にあたっては、明示的な廃棄処理を設ける必要があります」
URLClassLoader(JARファイルからクラスをロードする際に使用するクラス)は、JVMのライフタイム中はJARファイルへのストリームをオープンし続けます。

これによりJVMとWindowsの組み合わせではdeleteOnExit()メソッドでファイルが削除されないことになります。

バグ番号4171239
バグ番号4950148

関連記事

スポンサーリンク

while

ホームページ製作・web系アプリ系の製作案件募集中です。

上に戻る