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

标签 java cross-platform temporary-files

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

如果我使用

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

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

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

最佳答案

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

我知道这些选项:

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

关于java - 以与平台无关的方式创建大型临时文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27190903/

相关文章:

java - 为什么 System.getProperty ("java.io.tmpdir") 在 Mac OS X Catalina 10.15 上返回只读目录

java - Lambda 表达式和 Optional 如何返回 String 值

java - 如何使用 Jsoup 从标签元素中检索字符串?

c++ - 在 Linux 中清理无限循环应用程序的正确方法是什么?

python - 写入文件 f 后,调用 f.read() 返回 None

php - 在网页上存储文件一段时间

java - 在 Netbeans 中查找非法字符\0

java - 我需要某种适用于 Android 的刚体碰撞检测引擎

c - 在 Ubuntu 16.04 上构建 QEMU 版本 0.15.1 失败

qt - Qt的替代品