1

我正在尝试通过 POI 库使用 java 读取 .doc 文件。这是我的代码:

FileInputStream fis = new FileInputStream(file.getAbsolutePath());
HWPFDocument document = new HWPFDocument(fis);
WordExtractor extractor = new WordExtractor(document);
String [] fileData = extractor.getParagraphText();

我有这个例外:

java.io.IOException: Unable to read entire header; 162 bytes read; expected 512 bytes
at org.apache.poi.poifs.storage.HeaderBlock.alertShortRead(HeaderBlock.java:226)
at org.apache.poi.poifs.storage.HeaderBlock.readFirst512(HeaderBlock.java:207)
at org.apache.poi.poifs.storage.HeaderBlock.<init>(HeaderBlock.java:104)
at org.apache.poi.poifs.filesystem.POIFSFileSystem.<init>(POIFSFileSystem.java:138)
at MicrosoftWordParser.getDocString(MicrosoftWordParser.java:277)
at MicrosoftWordParser.main(MicrosoftWordParser.java:86)

我的文件没有损坏,我可以用 Microsoft Word 启动它。

我正在使用 poi 3.9(最新的稳定版本)。

你有解决问题的想法吗?

谢谢你。

4

5 回答 5

2

readFirst512()将读取您的前 512 个字节,Inputstream如果没有足够的字节读取,则抛出异常。我认为您的文件不够大,无法被 POI 读取。

于 2013-06-17T09:53:22.960 回答
0

一个 162 字节的 MS Word .doc 可能是一个“所有者文件”。Word 用来表示文件已锁定/拥有的临时文件。

它们具有 .doc 文件扩展名,但不是 MS Word Docs。

于 2014-03-05T17:03:45.137 回答
0

啊,你有一个文件,然后你通过将文件隐藏在 InputStream 后面来花费大量内存将整个内容缓冲到内存中......不要!如果您有文件,请将其提供给 POI。如果这就是你的全部,只给 POI 一个 InputStream

你的代码应该是这样的:

 NPOIFSFileSystem fs = new NPOIFSFileSystem(new File("myfile.doc"));
 HWPFDocument document = new HWPFDocument(fs.getRoot());

与将其读入 InputStream 相比,这会更快并且使用更少的内存,如果文件有问题,您通常也会得到更有用的错误消息

于 2013-06-18T11:32:13.570 回答
0

你应该试试这个程序。包文件操作;

import java.io.*;
import org.apache.poi.hwpf.HWPFDocument;
import org.apache.poi.hwpf.extractor.WordExtractor;

public class ReadDocFile {
public static void main(String[] args) {
File file = null;
WordExtractor extractor = null ;
try {

   file = new File("filepath location");
   FileInputStream fis=new FileInputStream(file.getAbsolutePath());
   HWPFDocument document=new HWPFDocument(fis);
   extractor = new WordExtractor(document);
   String [] fileData = extractor.getParagraphText();
   for(int i=0;i<fileData.length;i++){
     if(fileData[i] != null)
       System.out.println(fileData[i]);
   }
}
catch(Exception exep){}
  }
}
于 2013-06-17T11:59:25.273 回答
0

它可能不是正确的 Word 文件。它真的只有 162 字节长吗?检查您的文件系统。

我建议使用 Word 或 LibreOffice 创建一个新的 Word 文件,然后尝试使用您的程序读取它。

于 2013-06-17T10:17:29.650 回答