码农的狗蛋 2023-06-08 09:06 采纳率: 47.9%
浏览 20
已结题

java使用poi3.16版本中的WordExtractord读取fileinputstream 出现的问题

java使用poi3.16版本中的WordExtractord读取fileinputstream 出现的问题

Exception in thread "main" java.lang.NoSuchMethodError: org.apache.poi.util.IOUtils.toByteArray(Ljava/io/InputStream;I)[B
    at org.apache.poi.hwpf.HWPFDocumentCore.verifyAndBuildPOIFS(HWPFDocumentCore.java:96)
    at org.apache.poi.hwpf.extractor.WordExtractor.<init>(WordExtractor.java:51)
    at com.primeton.knowledge.word.wordEx.appWord(wordEx.java:58)
    at com.primeton.knowledge.word.wordEx.main(wordEx.java:40)


  • 写回答

1条回答 默认 最新

  • 一起看海呦 2023-06-08 10:49
    关注

    希望采纳

    根据异常信息,WordExtractor在初始化时调用了org.apache.poi.util.IOUtils.toByteArray(Ljava/io/InputStream;I)[B方法,但是你使用的POI 3.16版本并不包含这个方法。
    解决办法是:

    1. 升级POI版本。3.16版本比较老,最新版本已到4.1.2。升级到最新版本可以解决此错误。
    2. 如果有特别原因需要使用3.16版本,可以自行实现toByteArray方法:
    public byte[] toByteArray(InputStream in, int bufLen) throws IOException {
        ByteArrayOutputStream out = new ByteArrayOutputStream();
        byte[] buffer = new byte[bufLen];
        int len;
        while ((len = in.read(buffer)) > -1) {
            out.write(buffer, 0, len);
        }
        return out.toByteArray();
    }
    然后在调用WordExtractor之前,执行:
    IOUtils.toByteArray = IOUtilsExtension.toByteArray; 
    将自定义的toByteArray方法替换POI内部的方法。
    
    1. 另外一种办法是在初始化WordExtractor时,不传递InputStream,而是先读取为byte数组,然后构造WordExtractor:
    byte[] data = IOUtils.toByteArray(in);
    WordExtractor extractor = new WordExtractor(data);
    

    这种方式就不会直接调用POI内的toByteArray方法,可以避免此错误。
    所以,修复这个NoSuchMethodError异常的思路是:

    1. 升级POI版本到最新
    2. 自定义并替换掉缺失的方法
    3. 变更调用方式避免直接使用POI内的方法
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 6月17日
  • 已采纳回答 6月9日
  • 创建了问题 6月8日