用Java创建Temp文件的安全方法是什么?


96

我正在寻找在Java中创建临时文件的安全方法。安全起见,我的意思是:

  • 即使在潜在的竞争条件下,名称也应该是唯一的(例如,另一个线程同时调用同一函数,或者另一个进程同时运行此代码)
  • 即使在潜在的竞争条件下,文件也应该是私有的(例如,另一个用户尝试以较高的速率更改文件)
  • 我可以告诉它删除文件,而不必进行一般删除,并且冒着删除错误文件的风险
  • 理想情况下,即使有异常抛出,也应确保文件已删除,
  • 文件应默认为合理的位置(例如,JVM指定的tmp dir,默认为系统temp dir)

3
使用File f = File.createTempFile(prefix, extension)。它将被放置在临时目录中。并且f.deleteOnExit()它将在退出时自动删除。
BackSlash 2014年

3
如果虚拟机异常退出,则“退出时删除”将不会删除该文件。
约翰内斯,

Answers:


129

使用File.createTempFile()

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

将在temp目录中创建一个文件,例如:

前缀6340763779352094442-后缀


1
仅供参考,您不必担心拥有唯一的前缀/后缀,因为Java会在两者之间创建一个随机的数字字符串。
Squeazer 2014年

4
超!tempFile.delete()除了deleteOnExit(因为我不想在退出前成群散布临时文件)以外,在执行正常操作时是否还有其他问题?
SRobertJames 2014年

2
不,您可以选择任何一种方式。
Stefan

1
@SRobertJames:没问题。事实是,使用可预测的名称创建临时文件会带来安全问题。一旦以适当的权限以安全的方式创建它们,就不会创建它们。
Markus W Mahlberg 2014年

1
我认为这样做不安全,创建的文件是世界可读的,并且位于tmp目录中,该目录通常可供任何用户访问。
彼得·格伯

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.