有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

close()上的java Apache POI运行时异常

我在使用ApachePOI阅读一些内容时遇到问题。docx内容,并将结果显示为未格式化预览。我使用的是POI版本3.11

代码:

private static String POI2Text(File file) {
    POITextExtractor extractor = null;
    try {
        extractor = ExtractorFactory.createExtractor(file);
        return extractor.getText();
    } catch (Exception ex) {
        logger.warn("Error:", ex);
    } finally {
        if (extractor!=null) try { extractor.close(); } catch (Exception ex) { logger.warn("Error:", ex); }
    }
    return "";
}

在finally块(extractor.close())中引发以下异常:

org.apache.poi.openxml4j.exceptions.OpenXML4JRuntimeException: Fail to save: an error occurs while > saving the package : part
     at org.apache.poi.openxml4j.opc.ZipPackage.saveImpl(ZipPackage.java:503) ~[agent.jar:na]
     at org.apache.poi.openxml4j.opc.OPCPackage.save(OPCPackage.java:1425) ~[agent.jar:na]
     at org.apache.poi.openxml4j.opc.OPCPackage.save(OPCPackage.java:1412) ~[agent.jar:na]
     at org.apache.poi.openxml4j.opc.ZipPackage.closeImpl(ZipPackage.java:353) ~[agent.jar:na]
     at org.apache.poi.openxml4j.opc.OPCPackage.close(OPCPackage.java:425) ~[agent.jar:na]
     at org.apache.poi.POIXMLTextExtractor.close(POIXMLTextExtractor.java:87) ~[agent.jar:na]
     ....
Caused by: java.lang.IllegalArgumentException: part
     at org.apache.poi.openxml4j.opc.OPCPackage.addPackagePart(OPCPackage.java:873) ~[agent.jar:na]
     at org.apache.poi.openxml4j.opc.ZipPackage.saveImpl(ZipPackage.java:448) ~[agent.jar:na]
     ... 15 common frames omitted

有没有办法防止这种异常?最大的问题是,poi不会在抛出异常后释放文件句柄。我需要能够在我的应用程序之外移动或编辑文件


共 (1) 个答案

  1. # 1 楼答案

    只是一个快速反馈:我可以通过以只读方式打开inputstream,然后使用POITextExtractor使用该流提取数据来解决这个问题

    try (InputStream is = Files.newInputStream(path, StandardOpenOption.READ);
                POITextExtractor extractor = ExtractorFactory.createExtractor(is)) {
        return extractor.getText();
    } catch (Exception ex) {
        logger.warn("Error in file {}", path, ex);
    }