【问题标题】:Windows temporary file in JavaJava 中的 Windows 临时文件
【发布时间】:2011-02-23 15:09:58
【问题描述】:

如何在 Windows 中创建一个使用 Java 设置属性 FILE_ATTRIBUTE_TEMPORARYFILE_FLAG_DELETE_ON_CLOSE 的文件?

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

确切地说:delete-on-exit 机制并不让我满意,因为我想避免一些数据留在磁盘上以防应用程序崩溃等情况。

【问题讨论】:

    标签: java temporary-files java-io


    【解决方案1】:

    使用类似的东西。但它不会在内存中,而是在应用退出时被删除的临时文件。

    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(不是 Java)应用程序。从文件中读取是该应用程序的唯一选择。我想避免一些数据留在磁盘上的情况,例如应用程序崩溃。这就是为什么我认为临时 Windows 文件将是最好的解决方案。我认为,在某些情况下,退出时删除机制可能会将数据留在磁盘上。
    • @Przemysław,如果应用程序崩溃,您无法控制可以执行的内容。应用启动后立即清理临时文件怎么样?
    • FILE_ATTRIBUTE_TEMPORARY + FILE_FLAG_DELETE_ON_CLOSE 也有可能将文件留在磁盘上。如果你也使用 deleteOnExit,你会减少机会,因为系统内存必须承受压力,然后应用程序也会崩溃。 tmpfs 只提供了一个稍微好一点的选项,该文件在应用程序崩溃后仍然可用,直到下次重新启动。
    【解决方案2】:

    为什么不只使用内存块,即数据结构?创建文件的动机是什么?如果你想要一个临时文件,那么 temp filedelete on exit 会有所帮助。

    【讨论】:

    • 好吧,我想使用该文件将一些数据传递给外部 Windows(不是 Java)应用程序。从文件中读取是该应用程序的唯一选择。我想避免一些数据留在磁盘上的情况,例如应用程序崩溃。这就是为什么我认为临时 Windows 文件将是最好的解决方案。我认为,在某些情况下,退出时删除机制可能会将数据留在磁盘上。
    • @PrzemysławRóżycki - 问题是文件的内容(包括临时文件)在文件被删除后通常仍在磁盘上!您听说过“诺顿实用程序”吗?
    【解决方案3】:

    即使设置了这两个标志,您的文件也可能最终进入文件系统。如果系统缓存变得太小,则将文件写入磁盘,如果系统崩溃,则不执行进程后清理。

    但是,我喜欢您的想法,并且想知道为什么 Windows 上的 JVM 实现默认不使用这些标志。至少 deleteOnExit() 应该像这样作为后备实现。

    【讨论】:

      【解决方案4】:

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

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

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

      RamFS 和 TmpFS 的概述可以在 here 找到。

      但是请注意,RamFS 的内容有可能(至少在理论上)最终出现在磁盘上。

      • 如果系统进入休眠状态,RAM 的全部内容会在系统关闭之前保存到磁盘中。

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

      【讨论】:

      • 在我看来,Windows 和非 Windows 都提供了一个临时文件系统,如果系统内存不足,它们将被写入磁盘。 Java 程序员应该可以通过标准 API 访问此功能。
      • 我认为您在谈论分页/虚拟内存。 1) 它们不是临时文件。 2) 数据不仅在空间不足时写入分页区域。 3) 在 Java ... 或任何其他语言 ... 中没有这样的标准 API 允许应用程序将分页空间视为文件系统。 4) 我看不出这样的(假设的)API 将如何帮助 OP。
      • 不,我说的是临时文件。我的意思是非 Windows 操作系统上的 tmpfs 和 Windows 上的 FILE_ATTRIBUTE_TEMPORARY+FILE_FLAG_DELETE_ON_CLOSE。两者都允许将文件写入内存,并且仅在内存压力需要时才写入磁盘。 Java 中没有标准 API - 这是正确的,但 C++ 中有用于此的 API。它对 OP 有帮助,因为这正是他所要求的。 blogs.msdn.com/b/larryosterman/archive/2004/04/19/116084.aspx
      • 那么在这种情况下,1) 您对“如果系统内存不足,则写入磁盘的临时文件系统”的评论对于非 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 上它位于交换空间中。
      【解决方案5】:

      您正在寻找特定于 Windows 的解决方案,那么为什么不使用通过 Processbuilder 执行的 wndows 命令创建文件。

      【讨论】:

      • 虽然从问题来看这是正确的,但解决方案可能是通用的,因为 tmpfs 在 Linux 中的工作完全相同。
      猜你喜欢
      • 2010-11-04
      • 2012-06-25
      • 1970-01-01
      • 1970-01-01
      • 2013-03-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多