以与平台无关的方式创建大型临时文件

时间:2014-11-28 14:34:29

标签: java cross-platform temporary-files

在Java中创建大型临时文件的最佳方法是什么,并确保它在磁盘上,而不是在某个RAM中?

如果我使用

Path tempFile = Files.createTempFile("temp-file-name", ".tmp");

然后它适用于小文件,但在我的Linux机器上,它最终存储在/tmp中。在许多Linux机器上,这是一个由RAM支持的tmpfs文件系统,如果文件很大,将导致麻烦。在这样一个盒子上执行此操作的适当方法是将其放在/var/tmp中,但硬编码该路径对我来说似乎并不是非常跨平台。

是否有一种良好的跨平台方式在Java中创建临时文件并确保它由磁盘支持而不是由RAM支持?

1 个答案:

答案 0 :(得分:0)

没有独立于平台的方法来确定可用磁盘空间。实际上,甚至没有一种依赖于平台的良好方法。发生的事情是zfs文件系统(可能正在动态压缩数据),其他应用程序正在填充的目录,或者只是对您说谎的网络共享。

我知道这些选项:

  1. 假设这是一个运营问题。即无论使用该软件的人是谁,都应具有一个管理员,该管理员知道哪个设备上还剩下多少空间,并且希望能够显式配置应保存数据的分区。我会开始考虑使用几十GB的内存,而更喜欢考虑使用100 GB的内存。
  2. 假设它实际上是一个临时文件。记录该应用程序需要xxx GB的临时空间(无论您能给他们多少粗略估计,我的应用程序都会说“磁盘上保存的每个自动更新大约需要100 GB”)。
  3. 禁止用户缓存文件。 XDG标准具有$XDG_CACHE_HOME用于缓存;缓存目录应该很好,而且很大(看看使用Linux机器的任何人的~/.cache/)。在Windows上,您只需使用%TEMP%,但这没关系,因为%TEMP%应该还是很大。
    这提供了以下策略:尝试环境变量,首先使用XDG_CACHE_HOME(如果它是非空的,则是具有XDG约定的Posix系统),然后是TMP(如果它是非空的,则是Posix系统,而您不需要有比/tmp更好的选择),如果是Windows,最后还有TEMP