Java中的Windows临时文件

Java中的Windows临时文件,java,temporary-files,java-io,Java,Temporary Files,Java Io,如何在Windows中创建一个使用Java设置了属性file\u ATTRIBUTE\u TEMPORARY和file\u FLAG\u DELETE\u的文件 我确实希望我的文件只是在内存文件中 确切地说:退出时删除机制不能满足我的要求,因为我想避免某些数据留在磁盘上以防(例如)应用程序崩溃的情况。但它不会在内存中,而是在应用程序退出时删除的临时文件 try { // Create temp file. File temp = File.createTempFile("patt

如何在Windows中创建一个使用Java设置了属性
file\u ATTRIBUTE\u TEMPORARY
file\u FLAG\u DELETE\u的文件

我确实希望我的文件只是在内存文件中


确切地说:退出时删除机制不能满足我的要求,因为我想避免某些数据留在磁盘上以防(例如)应用程序崩溃的情况。但它不会在内存中,而是在应用程序退出时删除的临时文件

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) { 
// (..)
} 

为什么不使用内存块,即数据结构?创建文件背后的动机是什么?如果你想要一个临时文件,那么我会帮你的

我确实希望我的文件只是在内存文件中

将文件标记为临时文件并在Windows上关闭时删除并不能保证它不会写入文件系统

使用UNIX/Linux,您可以在TmpFS或RamFS文件系统中创建文件;i、 e.在RAM内存中存储文件的文件系统。TmpFS由虚拟内存支持,因此RamFS中的部分或全部文件可能最终存储在交换盘上。RamFS不受虚拟内存的支持,应该只驻留在RAM中

可以找到RAMF和TmpFS的概述

但请注意,RamFS内容可能(至少在理论上)最终出现在光盘上

  • 如果系统处于休眠状态,则RAM的全部内容将在系统断电前保存到光盘中

  • 如果内核可能被诱导崩溃,并且内核崩溃转储被启用,那么内核内存的内容(可能包括RamFS)将被写入转储


您正在寻找windows特定的解决方案,为什么不使用Processbuilder执行的wndows命令创建文件呢

即使同时设置了这两个标志,您的文件也可能最终出现在文件系统中。如果系统缓存变小,文件将写入磁盘,如果系统崩溃,则不会执行后处理清理


但是,我喜欢你的想法,我想知道为什么Windows上的JVM实现在默认情况下不使用这些标志。至少应该将deleteOnExit()实现为这样的后备方法。

好吧,我想使用该文件将一些数据传递给外部Windows(而不是Java)应用程序。读取文件是该应用程序的唯一选项。我希望避免这种情况,当一些数据离开磁盘时,以防应用程序崩溃。这就是为什么我认为,临时Windows文件将是最好的解决方案。我认为,在某些情况下,退出时删除机制可能会将数据留在磁盘上。@PrzemysławRóycki-问题是文件(包括临时文件)的内容通常在删除后仍在磁盘上!您听说过“Norton Utilities”?我想使用该文件将一些数据传递给外部Windows(而不是Java)应用程序。读取文件是该应用程序的唯一选项。我希望避免这种情况,当一些数据离开磁盘时,以防应用程序崩溃。这就是为什么我认为,临时Windows文件将是最好的解决方案。我认为,在某些情况下,退出时删除机制可能会将数据留在磁盘上。@Przemysław,如果应用程序崩溃,您无法控制可以执行什么。在应用程序启动后立即清理临时文件怎么样?
file\u ATTRIBUTE\u TEMPORARY
+
file\u FLAG\u DELETE\u ON\u CLOSE
也有可能将文件留在磁盘上。如果您也使用deleteOnExit,则会减少这种可能性,因为系统内存必须承受压力,然后应用程序也会崩溃。tmpfs只提供了一个稍微好一点的选项,在应用程序崩溃后,该文件将保持可用状态,直到下次重新启动。虽然问题是这样的,这个问题的解决方案可能是通用的,因为tmpfs在Linux中执行完全相同的任务。在我看来,Windows和非Windows都提供了一个临时文件系统,当系统内存不足时,这些文件将写入磁盘。Java程序员应该可以通过标准API访问此功能。1) 它们不是临时文件。2) 数据不仅在空间不足时写入分页区域。3) Java中没有这样的标准API。。。或者用任何其他语言。。。这允许应用程序将分页空间视为文件系统。4) 我看不出这样一个(假设的)API对OP有什么帮助。不,我说的是临时文件。我指的是非Windows操作系统上的tmpfs和Windows上的文件属性临时+文件标志删除。两者都允许将文件写入内存,并且仅在内存压力要求时才将文件写入磁盘。java中没有标准API,但在C++中有API。这对OP很有帮助,因为这正是他想要的。在这种情况下,1)您关于“写入磁盘的临时文件系统iff系统内存不足”的评论对于非Windows操作系统是不正确的。2) Linux/UNIX系统通常支持内存文件系统,但它们没有您声称的确切属性。3) AFAIK Java不提供了解此特殊属性的I/O API。。。当操作系统支持它时。4) 这并不能满足OP的需求。他想要的是永远不会写入磁盘的“文件”。他说“如何在Windows中创建一个文件,使用Java将属性设置为file_ATTRIBUTE_TEMPORARY和file_FLAG_DELETE_ON_CLOSE?”我知道Java中目前不存在这些API,我只是认为它们应该这样做。如果没有太多内存,我不认为我将文件写入磁盘是错误的——只是在Windows上它是一个可访问的文件,而在tmpfs上它位于交换空间中。