在Java中创建临时文件的安全方式是什么?

170

我正在寻找在Java中创建临时文件的安全方式。这里所说的“安全”是指:

  • 即使存在潜在的竞争条件(例如另一个线程同时调用相同的函数或另一个进程同时运行此代码),名称也应该是唯一的。
  • 即使存在潜在的竞争条件(例如另一个用户尝试高速更改文件权限),文件也应该是私有的。
  • 我可以告诉它删除文件,而不必进行一般性的删除,并冒着删除错误文件的风险。
  • 理想情况下,应确保在我没有机会采取行动之前删除文件,即使出现异常。
  • 文件应默认位于一个合理的位置(例如JVM指定的临时目录,默认为系统临时目录)。

6
使用File f = File.createTempFile(prefix, extension),它会被放置在临时目录中。通过使用f.deleteOnExit(),文件将在程序退出时自动删除。 - BackSlash
4
如果虚拟机因异常退出,"在退出时删除"选项将不会删除该文件。 - Johannes
请使用Files.createTempFile("tempfiles", ".tmp")代替,以提高安全性;请查看第二个最受欢迎的答案。 - Ricardo
2个回答

214

使用 File.createTempFile() 方法。

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

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

prefix-6340763779352094442-suffix


3
只是提供信息,你不需要担心要有唯一的前缀/后缀,因为Java会在它们之间创建一个随机字符串。 - Squeazer
4
没问题!deleteOnExit()只会在 JVM 退出之前删除临时文件,如果你不想在退出之前让大量临时文件悬挂,可以使用普通的 tempFile.delete() 进行删除。记住不要改变原文意思。 - SRobertJames
3
可以任选一种方式,都是可以的。 - Stefan
1
@SRobertJames:没问题。问题在于使用可预测的名称创建临时文件会带来安全问题。一旦以适当的权限安全地创建它们,它们就不会存在问题了。 - Markus W Mahlberg
7
我认为这并不安全,创建的文件可以被所有用户读取,并且它位于 tmp 目录中,该目录通常对任何用户都是可访问的。 - Peter Gerber
显示剩余2条评论

69

自Java 7以来,新的文件API“NIO2”中包含了创建临时文件和目录的新方法。请参见

例如:

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

或者

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

安全提示:

File.createTempFile()Files.createTempFile 之间的一个重要区别是后者具有更安全的权限默认值。

当未指定文件属性时,使用 Files.createTempFile(String,String,File) 方法创建的文件可能具有比使用 File.createTempFile(String,String,File) 方法创建的文件更严格的访问权限。


1
我更喜欢NIO,它不需要前缀。 - Franklin Yu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接