Javaで一時ファイルを作成する安全な方法は何ですか?


96

Javaで一時ファイルを作成する安全な方法を探しています。安全とは、次のことを意味します。

  • 潜在的な競合状態でも、名前は一意である必要があります(たとえば、別のスレッドが同じfuncを同時に呼び出すか、別のプロセスがこのコードを同時に実行します)。
  • 潜在的な競合状態でも、ファイルはプライベートである必要があります(たとえば、別のユーザーがファイルを高速でchmodしようとした場合)
  • 一般的な削除を行わなくても、ファイルを削除するように指示できます。間違ったファイルを削除する危険があります。
  • 理想的には、例外がスローされても、ファイルを確実に削除する必要があります。
  • ファイルはデフォルトで正しい場所に設定する必要があります(例:JVMが指定したtmp dir、デフォルトはシステムのtemp dir)

3
を使用しFile f = File.createTempFile(prefix, extension)ます。一時ディレクトリに配置されます。そして、f.deleteOnExit()それは終了時に自動的に削除されます。
BackSlash 2014

3
終了時に削除は、VMが例外で終了した場合、ファイルを削除しません。
ヨハネス

回答:


129

を使用しFile.createTempFile()ます。

File tempFile = File.createTempFile("prefix-", "-suffix");
//File tempFile = File.createTempFile("MyAppName-", ".tmp");
tempFile.deleteOnExit();

次のように一時ディレクトリにファイルを作成します:

prefix-6340763779352094442-suffix


1
参考までに、Javaはランダムな数値の文字列をその間に作成するので、一意のプレフィックス/サフィックスを持つことを心配する必要はありません。
Squeazer 2014

4
素晴らしい!(終了する前に一時ファイルの大群がぶらぶらしたくないので)にtempFile.delete()加えて通常の問題がありdeleteOnExitますか?
SRobertJames 2014

2
いいえ、どちらの方法でも実行できます。
Stefan

1
@SRobertJames:問題ありません。事はことである創造予測可能な名前の一時ファイルのセキュリティ上の問題を課します。それらが適切な権限で安全な方法で作成されると、作成されません。
Markus W Mahlberg 2014

1
私はこれを安全だとは思いません。作成されたファイルは誰でも読み取り可能であり、どのユーザーからもアクセスしやすいtmpディレクトリにあります。
Peter Gerber

37

Java 7以降、temnpファイルとディレクトリを作成するための新しいメソッドを含む新しいファイルAPI "NIO2"があります。見る

例えば

Path tempDir = Files.createTempDirectory("tempfiles");

または

Path tempFile = Files.createTempFile("tempfiles", ".tmp");

1
プレフィックスを必要としないNIOを好みます。
フランクリンYu
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.