2017-10-17 5 views
0

私はいくつかのハウスキーピングタスクを実行するための一時ディレクトリを作成しています。これらのタスクがすべて完了するとすぐに削除したいと考えています。これらのジョブは例外をスローすることができますが、これらのすべてのテンポラリファイルを手動で削除する必要はありません。ここにその様子があります:finallyブロックでディレクトリを削除しますか?

try{ 
    Path p = //tmp dir 
    doJob1(p); 
    doJob2(p); 
} finally{ 
    p.toFile().delete(); 
} 

私はそれのようなものを見たことはありません。 finallyブロックのロック解除は一般的です。しかし、ファイルの削除はどうですか?いくつかの欠点はありますか? pを想定し

+0

https://docs.oracle.com/javase/8/docs/api/java/io/File.html#deleteOnExit--を使用することをお勧めします。 –

+1

@davida '終了時に削除'は、削除するファイルのリストを作成します。これは、実行中のプロセス(Webサーバーなど)でメモリホッグになります。 –

答えて

1

現在の実装の欠点は、finallyブロックに例外処理がないことです。 FileのdeleteメソッドはSecurityExceptionをスローすることができます(つまり、何らかの理由でリソースにアクセスできません)。 Callables/Runnablesを使用してジョブを非同期的に実行することにした場合、これが問題になることもあります。その場合、finallyブロックはジョブが完了する前に実行しようとする可能性があり、おそらく失敗します。

+0

優れた点! –

1

が、それはあなたが(再帰的に)ファイルを削除する必要がありますディレクトリである場合は、

Files.delete(p); 

または

Files.deleteIfExists(p); 

p.toFile().delete()を置き換える可能性があるファイルではなくディレクトリでありますその中にフォルダがあります。

1

ファイルを削除するのはどうですか?いくつかの欠点はありますか?

いくつかの懸念があります。

  1. あなたは任意のファイルを含むディレクトリを削除することはできません。ディレクトリ内のファイル(またはディレクトリ)を最初に削除する必要があります。

  2. 一部のプラットフォーム(Windowsなど)では、現在開いているファイルを削除できません。

+0

私は何かが間違っていることを知っていました。ありがとうございました。 –

関連する問題