gpt4 book ai didi

java - POI中如何判断文件是doc还是docx

转载 作者:行者123 更新时间:2023-12-01 14:21:33 24 4
gpt4 key购买 nike

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

// 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();
}

这在大多数情况下都有效。但我发现对于某些扩展名为 doc 的文件(本质上是一个 docx 文件)如果你用 winrar 打开,你会发现 xml文件。众所周知, docx文件是 zip文件由 xml 组成文件。
相信这个问题应该不少见。但我还没有找到任何关于这方面的信息。显然,从扩展名来看,读取的是 docdocx不合适。

就我而言,我必须阅读大量文件。我什至会阅读 docdocx在压缩文件中, zip , 7z甚至 rar .因此,我必须通过 inputStream 而不是 File 或其他东西来读取内容。所以 how to know whether a file is .docx or .doc format from Apache POI完全不适合我的情况 ZipInputStream .

判断文件的最佳方式是 docdocx ?我想要一个从文件中读取内容的解决方案,该文件可能是 docdocx .但不仅仅是简单地判断它是 doc 还是 docx。显然, ZipInpuStream对我的情况来说不是一个好方法。而且我相信这对其他人来说也不是一个合适的方法。为什么我要判断文件是不是 docdocx异常(exception)?

最佳答案

使用当前稳定apache poi您可以使用 3.17 版 FileMagic .但是internally这个当然也要看看进入文件。

例子:

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();

}
}

关于java - POI中如何判断文件是doc还是docx,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47483011/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com