【发布时间】:2011-02-23 15:09:58
【问题描述】:
如何在 Windows 中创建一个使用 Java 设置属性 FILE_ATTRIBUTE_TEMPORARY 和 FILE_FLAG_DELETE_ON_CLOSE 的文件?
我确实希望我的文件只是内存中的文件。
确切地说:delete-on-exit 机制并不让我满意,因为我想避免一些数据留在磁盘上以防应用程序崩溃等情况。
【问题讨论】:
标签: java temporary-files java-io
如何在 Windows 中创建一个使用 Java 设置属性 FILE_ATTRIBUTE_TEMPORARY 和 FILE_FLAG_DELETE_ON_CLOSE 的文件?
我确实希望我的文件只是内存中的文件。
确切地说:delete-on-exit 机制并不让我满意,因为我想避免一些数据留在磁盘上以防应用程序崩溃等情况。
【问题讨论】:
标签: java temporary-files java-io
使用类似的东西。但它不会在内存中,而是在应用退出时被删除的临时文件。
try {
// Create temp file.
File temp = File.createTempFile("pattern", ".suffix");
// Delete temp file when program exits.
temp.deleteOnExit();
// Write to temp file
BufferedWriter out = new BufferedWriter(new FileWriter(temp));
out.write("aString");
out.close();
} catch (IOException e) {
// (..)
}
【讨论】:
FILE_ATTRIBUTE_TEMPORARY + FILE_FLAG_DELETE_ON_CLOSE 也有可能将文件留在磁盘上。如果你也使用 deleteOnExit,你会减少机会,因为系统内存必须承受压力,然后应用程序也会崩溃。 tmpfs 只提供了一个稍微好一点的选项,该文件在应用程序崩溃后仍然可用,直到下次重新启动。
为什么不只使用内存块,即数据结构?创建文件的动机是什么?如果你想要一个临时文件,那么 temp file 和 delete on exit 会有所帮助。
【讨论】:
即使设置了这两个标志,您的文件也可能最终进入文件系统。如果系统缓存变得太小,则将文件写入磁盘,如果系统崩溃,则不执行进程后清理。
但是,我喜欢您的想法,并且想知道为什么 Windows 上的 JVM 实现默认不使用这些标志。至少 deleteOnExit() 应该像这样作为后备实现。
【讨论】:
我确实希望我的文件只是内存中的文件。
在 Windows 上将文件标记为临时文件并在关闭时删除并不能保证它不会写入文件系统。
使用 UNIX / Linux,您可以在 TmpFS 或 RamFS 文件系统中创建文件;即在 RAM 内存中存储文件的文件系统。 TmpFS 由虚拟内存支持,因此 RamFS 中的部分或全部文件可能最终会出现在交换磁盘上。 RamFS 不受虚拟内存支持,只能驻留在 RAM 中。
RamFS 和 TmpFS 的概述可以在 here 找到。
但是请注意,RamFS 的内容有可能(至少在理论上)最终出现在磁盘上。
如果系统进入休眠状态,RAM 的全部内容会在系统关闭之前保存到磁盘中。
如果可以诱导内核崩溃并启用内核崩溃转储,则内核内存(可能包括 RamFS)的内容将被写入转储。
【讨论】:
您正在寻找特定于 Windows 的解决方案,那么为什么不使用通过 Processbuilder 执行的 wndows 命令创建文件。
【讨论】: