Java POI读取文件而不更新文件时间戳

Java POI读取文件而不更新文件时间戳,java,apache-poi,Java,Apache Poi,似乎可以使用打开Excel文件 Workbook wb = WorkbookFactory.create(myFile); …但是,即使不做任何更改,也要打电话给 wb.close(); …释放资源将导致文件系统上的文件被更新(如果没有其他内容,则至少时间戳是)。我发现解决这个问题的唯一方法是指定工作簿应使用“只读”创建 我想做的是: 我想从文件中打开现有工作簿 立即释放所有文件系统资源,但将工作簿保留在内存中;(这不应更新原始文件的时间戳) 对内存工作簿进行更改 将修改后的工作簿保存到新

似乎可以使用打开Excel文件

Workbook wb = WorkbookFactory.create(myFile);
…但是,即使不做任何更改,也要打电话给

wb.close();
…释放资源将导致文件系统上的文件被更新(如果没有其他内容,则至少时间戳是)。我发现解决这个问题的唯一方法是指定工作簿应使用“只读”创建

我想做的是:

  • 我想从文件中打开现有工作簿
  • 立即释放所有文件系统资源,但将工作簿保留在内存中;(这不应更新原始文件的时间戳)
  • 对内存工作簿进行更改
  • 将修改后的工作簿保存到新文件
这可能吗?我试过很多东西,但似乎都没能奏效。如果我不想更新原始文件的时间戳,似乎我必须以只读方式打开工作簿。但是我不能在内存中修改它,以便以后写入新文件。第二十二条军规

[顺便说一句,我是从一个文件而不是一个流创建工作簿,因为我知道它更有效。如果我使用流,我可以通过自己关闭流来解决这个问题。此外,我使用的是XLSX/XLSM而不是XLS文件。]

想法?谢谢

选项可以是:

  • 创建文件副本并对副本进行读/写操作
  • 以只读方式打开原始文件,然后根据需要创建要写入的副本
  • 使用原始文件中的输入流创建工作簿

  • 好主意。问题是,我只有在读取文件后才能知道是否需要进行后续写入。(这是用户的决定。)因此,我希望读取该文件,释放资源,然后仅在以后需要时创建一个新文件。谢谢你的建议。我明白了,如果你不想创建和删除一个文件(如果不需要修改),那么你可能需要以只读模式打开该文件,如果需要修改,创建一个副本并重新打开副本进行修改。哦,好的,我希望避免这种情况(由于打开文件的成本,可能相当大)。谢谢。是的,这将意味着读取文件两次,因此,如果不需要修改,则首先复制文件并将其删除可能会更有效。我还建议尝试使用流创建工作簿,尽管正如您所说,POI在使用流时可能效率低下,但可能值得一试。因此,您有三种选择可以尝试:1)创建文件副本,如果不需要修改,则删除。2) 读取文件两次(只读模式下一次)3)使用流创建工作簿。谢谢。另一种可能有效的方法是自己打开OPCPackage,读入工作簿(通过将包传递给XSSFWorkbook构造函数),然后调用包上的revert(),这样就可以释放资源,而无需将任何内容写回文件。还需要测试,但我很有希望,你呢?您能使用
    .xls
    而不是
    .xlsx
    吗?(从3.15 beta 2/3.15 final开始,前者目前对就地写入和写入新文件提供了更好的支持)感谢您提供的信息和建议。不幸的是,我大部分时间都在使用XLSX。
    Workbook wb = WorkbookFactory.create(myFile, true);