我正在寻找在Java中创建临时文件的安全方式。这里所说的“安全”是指:
- 即使存在潜在的竞争条件(例如另一个线程同时调用相同的函数或另一个进程同时运行此代码),名称也应该是唯一的。
- 即使存在潜在的竞争条件(例如另一个用户尝试高速更改文件权限),文件也应该是私有的。
- 我可以告诉它删除文件,而不必进行一般性的删除,并冒着删除错误文件的风险。
- 理想情况下,应确保在我没有机会采取行动之前删除文件,即使出现异常。
- 文件应默认位于一个合理的位置(例如JVM指定的临时目录,默认为系统临时目录)。
我正在寻找在Java中创建临时文件的安全方式。这里所说的“安全”是指:
使用 File.createTempFile()
方法。
File tempFile = File.createTempFile("prefix-", "-suffix");
//File tempFile = File.createTempFile("MyAppName-", ".tmp");
tempFile.deleteOnExit();
将在临时目录中创建一个文件,例如:
prefix-6340763779352094442-suffix
deleteOnExit()
只会在 JVM 退出之前删除临时文件,如果你不想在退出之前让大量临时文件悬挂,可以使用普通的 tempFile.delete()
进行删除。记住不要改变原文意思。 - SRobertJames自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)
方法创建的文件更严格的访问权限。
File f = File.createTempFile(prefix, extension)
,它会被放置在临时目录中。通过使用f.deleteOnExit()
,文件将在程序退出时自动删除。 - BackSlashFiles.createTempFile("tempfiles", ".tmp")
代替,以提高安全性;请查看第二个最受欢迎的答案。 - Ricardo