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()メソッドでファイルが削除されないことになります。
関連記事
- プログラムでもっとも正確に日本の祝日を求める方法(内閣府公表CSVの過去3度の改訂履歴)
- Twitter APIでのエラーの一覧
- cron実行時の標準出力のメールを飛ばさない方法(cron実行時に毎回メールを飛ばさない)
- cron実行時のPATHなどの環境変数を確認する方法
- cronのメール送信先を指定する方法(cronごとに送信先のメールアドレスを指定する方法)
- cron実行時に『/bin/sh: 〜〜: command not found』と出てcronが実行されない場合
- 『crontab -r』でcronの設定を間違って消してしまった場合の対処法
- cronを実行すると『TERM environment variable not set.』というエラーメールが飛ぶ
- 「ID」や「ID_xxxx」という文字列があるCSVファイルをExcelで開くとSYLKエラーが出る
- Excelの日付が数字になるときの対処法
- facebook APIを使用する時にfacebook Appsでアプリを登録するまでの流れ
- SELECTタグで色を選択する場合のサンプル
- 文字列の置き換えを行う方法 (replaceAllで気をつけること)
- 文字列の部分一致検索を行う方法
- Java メモリー使用量を取得する方法
- 実行中のメソッド名やクラス名を取得する方法
- Singletonパターンを使ってクラスのインスタンスを1つにする(共有クラスのリソースを削減する方法)
- [暗号化]ブロック暗号とは(AES/DES/Blowfish PKCS5Padding ECB/CBC IV)
- ==とequalsメソッドの違い 値が同じかどうかを見るにはequalsメソッドを使う
- Exception in thread "main" java.lang.NoClassDefFoundError: HelloWorld
- javaコマンドは実行できるが、javacコマンドが実行できないとき
- Javaをコマンドラインから実行する
- JD-Eclipse 自動で逆コンパイルをすることができるプラグイン
- Java標準以外のライブラリ(パッケージ)を読み込む方法 jarファイルを追加する
- switch文とif文の違い
- NetBeans6のインストール(JavaだけでなくRuby、PHP、C/C++に対応した統合開発環境)
- Java JDK6のインストール
- 変数のデータ型
- Eclipseで逆コンパイルを行う JadClipse
- scarab [バグ追跡システム]
- JTrac [バグ追跡システム]
スポンサーリンク