提问者:小点点

如何判断文件是文档还是docx在POI


标题可能有点混乱。最简单的方法必须是通过扩展名来判断,就像:

// is represents the InputStream   
if (filePath.endsWith("doc")) {
    WordExtractor ex = new WordExtractor(is);
    text = ex.getText();
    ex.close();
} else if(filePath.endsWith("docx")) {
    XWPFDocument doc = new XWPFDocument(is);
    XWPFWordExtractor extractor = new XWPFWordExtractor(doc);
    text = extractor.getText();
    extractor.close();
}

这在大多数情况下都有效。但我发现,对于某些扩展名为文档的文件(本质上是一个docx文件),如果使用winrar打开,你会发现xml文件。由于已知docx文件是一个由xml文件组成的zip文件。我相信这个问题一定不在少数。但我没有找到任何关于这个的信息。显然,通过扩展名来判断读取文档docx是不合适的。

就我而言,我必须阅读很多文件。我甚至会阅读压缩文件中的文档docxzip7z甚至rar。因此,我必须通过inputStream而不是File或其他东西来读取内容。那么如何知道文件是. docx还是ApachePOI的.文档格式完全不适合我使用ZipInputStream的情况。

判断文件是文档还是docx的最佳方法是什么?我想要一个解决方案来读取可能是文档docx的文件中的内容。但不仅仅是简单地判断它是文档还是docx。显然,ZipInpuStream对我来说不是一个好方法。我相信它也不适合其他人。为什么我必须通过异常来判断文件是文档还是docx


共2个答案

匿名用户

使用当前稳定的apache poi版本3.17,您可以使用FileMagic。但在内部,这当然也会查看文件。

示例:

import java.io.InputStream;
import java.io.FileInputStream;
import java.io.BufferedInputStream;

import org.apache.poi.poifs.filesystem.FileMagic;

import org.apache.poi.hwpf.extractor.WordExtractor;
import org.apache.poi.xwpf.extractor.XWPFWordExtractor;
import org.apache.poi.xwpf.usermodel.XWPFDocument;

public class ReadWord {

 static String read(InputStream is) throws Exception {

System.out.println(FileMagic.valueOf(is));

  String text = "";

  if (FileMagic.valueOf(is) == FileMagic.OLE2) {
   WordExtractor ex = new WordExtractor(is);
   text = ex.getText();
   ex.close();
  } else if(FileMagic.valueOf(is) == FileMagic.OOXML) {
   XWPFDocument doc = new XWPFDocument(is);
   XWPFWordExtractor extractor = new XWPFWordExtractor(doc);
   text = extractor.getText();
   extractor.close();
  }

  return text;

 }

 public static void main(String[] args) throws Exception {

  InputStream is = new BufferedInputStream(new FileInputStream("ExampleOLE.doc")); //really a binary OLE2 Word file
  System.out.println(read(is));
  is.close();

  is = new BufferedInputStream(new FileInputStream("ExampleOOXML.doc")); //a OOXML Word file named *.doc
  System.out.println(read(is));
  is.close();

  is = new BufferedInputStream(new FileInputStream("ExampleOOXML.docx")); //really a OOXML Word file
  System.out.println(read(is));
  is.close();

 }
}

匿名用户

try {
    new ZipFile(new File("/Users/giang/Documents/a.doc"));
    System.out.println("this file is .docx");
} catch (ZipException e) {
    System.out.println("this file is not .docx");
    e.printStackTrace();
}