在Java中读取.doc
文件(Microsoft Word旧版格式)需要借助第三方库,因为.doc
文件是二进制格式的复合文档结构,无法通过标准的Java IO(如FileReader
或BufferedReader
)直接解析为文本内容,以下是使用Apache POI库读取.doc
文件的详细方案:
准备工作:添加Apache POI依赖
Apache POI是开源的Java库,支持操作Microsoft Office文档(包括.doc
和.docx
),需在项目中引入以下依赖:
依赖类型 | 配置示例(Maven) | 说明 |
---|---|---|
Maven | <dependency>n <groupId>org.apache.poi</groupId>n <artifactId>poi</artifactId>n <version>5.2.3</version>n</dependency> |
用于.doc 文件的核心依赖 |
Gradle | implementation 'org.apache.poi:poi:5.2.3' |
同上 |
注意:若需处理.docx
文件,还需添加poi-ooxml
依赖。
读取.doc
文件的步骤
创建输入流
FileInputStream fis = new FileInputStream("path/to/file.doc");
解析文档
使用HWPFDocument
类(POI对.doc
的支持):
import org.apache.poi.hwpf.HWPFDocument; import org.apache.poi.hwpf.extractor.WordTextExtractor; HWPFDocument document = new HWPFDocument(fis); WordTextExtractor extractor = new WordTextExtractor(document); String text = extractor.getText(); // 提取纯文本
处理复杂内容
.doc
文件可能包含段落、表格、图片等元素,需通过POI的API逐层解析:
功能 | 对应类/方法 | 示例代码 |
---|---|---|
获取段落文本 | Range.getParagraphs() |
for (int i = 0; i < document.getRange().numParagraphs(); i++) { ... } |
读取表格数据 | Table[] tables = document.getTables(); |
遍历tables 数组,调用Table.getRows() 和Row.getCells() |
提取元数据 | DocumentSummaryInformation dsi = document.getDocumentSummaryInformation(); |
获取作者、标题等信息 |
.doc
与.docx
处理差异对比
特性 | .doc 处理方式 |
.docx 处理方式 |
---|---|---|
核心类 | HWPFDocument |
XWPFDocument |
文本提取 | WordTextExtractor |
XWPFWordExtractor |
表格处理 | Table 接口 |
XWPFTable 类 |
完整代码示例
import org.apache.poi.hwpf.HWPFDocument; import org.apache.poi.hwpf.extractor.WordTextExtractor; import java.io.FileInputStream; import java.io.IOException; public class DocReader { public static void main(String[] args) throws IOException { FileInputStream fis = new FileInputStream("example.doc"); HWPFDocument document = new HWPFDocument(fis); WordTextExtractor extractor = new WordTextExtractor(document); String content = extractor.getText(); System.out.println(content); extractor.close(); document.close(); fis.close(); } }
注意事项
- 性能问题:
.doc
文件解析需加载整个文档到内存,大文件可能导致OOM错误,建议使用流式处理或限制文件大小。 - 兼容性:Apache POI对老旧
.doc
格式的某些特性(如嵌套表格、宏)支持有限,复杂文档可能需要手动调整。 - 替代方案:若允许修改源文件格式,建议将
.doc
转换为.docx
,因POI对.docx
的支持更完善且性能更佳。
FAQs
为什么不能用Java标准IO(如FileReader
)直接读取.doc
文件?
- 原因:
.doc
文件是二进制格式,包含字体、段落样式、嵌入对象等复杂结构,直接按文本读取会破坏格式并产生乱码,必须通过专用库解析二进制结构。
如何读取加密的.doc
文件?
- 解决:使用
HWPFDocument
的密码参数构造函数:HWPFDocument document = new HWPFDocument(fis, "password");
若文档保护(如只读),需额外
原创文章,发布者:酷盾叔,转转请注明出处:https://www.kd.cn/ask/74646.html