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)


希望采纳

根据异常信息,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内的方法