【问题标题】:What is a safe way to create a Temp file in Java?在 Java 中创建临时文件的安全方法是什么?
【发布时间】:2015-01-07 17:21:00
【问题描述】:

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

  • 名称应该是唯一的,即使在潜在的竞争条件下(例如,另一个线程同时调用相同的函数,或者另一个进程同时运行此代码)
  • 文件应该是私有的,即使在潜在的竞争条件下(例如,另一个用户试图以高速率 chmod 文件)
  • 我可以告诉它删除文件,而无需我进行一般删除操作,并且有删除错误文件的风险
  • 理想情况下,应该确保文件被删除,即使在我有机会之前抛出异常
  • 文件应该默认到一个正常的位置(例如,JVM 指定的 tmp 目录,默认到系统临时目录)

【问题讨论】:

  • 使用File f = File.createTempFile(prefix, extension)。它将被放置在临时目录中。使用f.deleteOnExit(),它会在退出时自动删除。
  • Delete on Exit 不会删除文件,如果 vm 异常退出。

标签: java temporary-files


【解决方案1】:

使用File.createTempFile()

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

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

前缀-6340763779352094442-后缀

【讨论】:

  • 仅供参考,您不必担心有唯一的前缀/后缀,因为 Java 会在两者之间创建一个随机的数字字符串。
  • 超级!除了deleteOnExit 之外,做一个普通的tempFile.delete() 有什么问题吗(因为我不想在退出前有成群的临时文件)?
  • 不,你可以这样做。
  • @SRobertJames:没问题。问题是具有可预测名称的临时文件的创建 会带来安全问题。一旦它们以安全的方式创建并具有适当的权限,它们就不会。
  • 我不认为这是安全的,创建的文件是世界可读的,它位于任何用户都可以访问的 tmp 目录中。
【解决方案2】:

从 Java 7 开始,有了新的文件 API“NIO2”,其中包含用于创建临时文件和目录的新方法。见

例如

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

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

安全通知:

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

如果没有指定文件属性,则生成的文件可能 对由 File.createTempFile(String,String,File) 方法。

【讨论】:

  • 我更喜欢 NIO,它不需要前缀。
猜你喜欢
  • 2011-05-29
  • 1970-01-01
  • 2012-09-01
  • 1970-01-01
  • 2014-03-28
  • 2020-04-28
  • 2012-09-16
  • 2013-08-04
  • 1970-01-01
相关资源
最近更新 更多