在 Java 中创建大型临时文件并确保它位于磁盘上而不是 RAM 中的某个位置的最佳方法是什么?
如果我使用
Path tempFile = Files.createTempFile("temp-file-name", ".tmp");
然后它对于小文件工作得很好,但在我的 Linux 机器上,它最终被存储在 /tmp
中。在许多 Linux 机器上,这是一个 tmpfs 文件系统,由 RAM 支持,如果文件很大,这会造成麻烦。在这样的盒子上执行此操作的适当方法是将其放入 /var/tmp
中,但对该路径进行硬编码对我来说似乎不太跨平台。
有没有一种好的跨平台方法可以在 Java 中创建临时文件并确保它由磁盘而不是 RAM 支持?
最佳答案
没有独立于平台的方法来确定可用磁盘空间。实际上甚至没有一个好的依赖于平台的方法;发生的事情包括 zfs 文件系统(可能会动态压缩您的数据)、被其他应用程序填充的目录或只是对您撒谎的网络共享。
我知道这些选项:
- 假设这是一家运营企业。 IE。无论谁使用该软件,都应该有一个管理员,该管理员知道什么设备上还剩多少空间,并且希望能够明确配置应保存数据的分区。我会开始考虑几十 GB,并且更喜欢几百 GB。
- 假设它确实是一个临时文件。记录应用程序需要 xxx GB 的临时空间(无论您可以给他们什么粗略的估计 - 我的应用程序说“您在磁盘上保存的每个自动更新需要大约 100 GB”)。
- 滥用文件的用户缓存。 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/