如何在Windows中创建使用Java设置属性FILE_ATTRIBUTE_TEMPORARY
和FILE_FLAG_DELETE_ON_CLOSE
的文件?
我确实希望我的文件只是内存文件。
准确地说:delete-on-exit机制不能满足我,因为我想避免一些情况,例如,当某些数据留在磁盘上时,例如应用程序崩溃。
答案 0 :(得分:4)
使用类似的东西。它不会在内存中,而是在应用程序退出时删除的临时文件。
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) {
// (..)
}
答案 1 :(得分:2)
为什么不使用内存块即数据结构?创建文件背后的动机是什么?如果您想要一个临时文件,那么temp file和delete on exit会有所帮助。
答案 2 :(得分:1)
即使设置了两个标志,您的文件也可能最终出现在文件系统中。如果系统缓存变得太小,则将文件写入磁盘,如果系统崩溃,则不执行进程后清理。
但是,我喜欢你的想法并想知道为什么Windows上的JVM实现默认不使用这些标志。至少deleteOnExit()应该像这样实现为后备。
答案 3 :(得分:0)
我确实希望我的文件只是内存文件。
将文件标记为临时文件并在Windows上删除关闭并不能保证它不会写入文件系统。
使用UNIX / Linux,您可以在TmpFS或RamFS文件系统中创建文件;即,将文件存储在RAM存储器中的文件系统。 TmpFS由虚拟内存支持,因此RamFS中的部分或全部文件可能最终出现在交换盘上。 RamFS不受虚拟内存的支持,只能驻留在RAM中。
可以找到RamFS和TmpFS的概述here。
但请注意,(至少在理论上)RamFS内容最终可能会出现在光盘上。
如果系统进入休眠状态,则在系统关闭电源之前,RAM的全部内容都会保存到光盘中。
如果内核可能被引发崩溃并且启用了内核崩溃转储,则内核内存(可能包括RamFS)的内容将被写入转储。
答案 4 :(得分:0)
您正在使用特定于Windows的解决方案,因此为什么不使用通过Processbuilder执行的 wndows 命令创建文件。