Apache POI:ZLIB 输入流意外结束

问题描述 投票:0回答:2

我正在尝试替换同一文件中Word文档中的一些单词。

public class WordEdit {
    static String DocX;
    static String DocX2;
    public static void main(String[] args) throws Exception {
        DocX = "C:\\Users\\aneesh.shaik\\Downloads\\I&TF-0206-2024.docx";
        DocX2 = "D:\\Automation\\Files\\I&TF-0206-2024.docx";
        XWPFDocument doc = new XWPFDocument(OPCPackage.open(DocX));
        for (XWPFTable tbl : doc.getTables()) {
               for (XWPFTableRow row : tbl.getRows()) {
                  for (XWPFTableCell cell : row.getTableCells()) {
                     for (XWPFParagraph p : cell.getParagraphs()) {
                        for (XWPFRun r : p.getRuns()) {
                          String text = r.getText(0);
                          if (text != null && text.contains("Aneesh423")) {
                            text = text.replace("Aneesh423", "Aneesh");
                            System.out.println("find 2");
                            r.setText(text,0);
                          }
                        }
                     }
                  }
               }
            }
        doc.write(new FileOutputStream(DocX)); // Getting error on this line
        doc.close();        
    }
}

如果我将其写入 DocX2 文件位置,那么它可以正常工作。但如果我想将其写入 DocX 文件位置的同一文档中,则会出现错误。

请帮忙解决这个问题。

java apache-poi
2个回答
0
投票

尝试写入同一文件时遇到的错误可能是由于文件被打开或锁定所致,如果文件正在被其他进程或应用程序访问,则可能会发生这种情况。当您测试写入不同位置(例如驱动器 D)时,该文件当时可能尚未被其他进程锁定,从而允许写入操作成功。

为了防止此类冲突,最好先将修改的内容写入新文件,如我之前提供的代码片段所示。这样,您就可以避免与文件锁定相关的潜在问题,确保成功创建更新的文档。

DocXnew = "C:\\Users\\aneesh.shaik\\Downloads\\I&TF-0206-2024_new.docx";

try (FileOutputStream out = new FileOutputStream(DocXnew)) {
    doc.write(out);
    System.out.println("File updated successfully.");
} catch (IOException e) {
    e.printStackTrace();
}
doc.close();

0
投票

代码行

XWPFDocument doc = new XWPFDocument(OPCPackage.open(DocX));
通过打开
XWPFDocument
后面的文件来创建
DocX
并让文件保持打开状态。这节省了一点随机存取存储器。但当然不能向打开的文件写入任何内容。

如果您要使用

XWPFDocument doc = new XWPFDocument(new FileInputStream(DocX));
,那么这将通过使用
XWPFDocument
读取
DocX
后面的文件内容来创建
FileInputStream
。文件不会保持打开状态,并且
FileOutputStream
可以写入同一个文件。

© www.soinside.com 2019 - 2024. All rights reserved.