网站首页 > java教程 正文
前段时间有一个客户遇到了一件很奇怪的事情,他在使用程序解析一批word文件时,程序在运行一段时间后总是会自动中断,他查看了导致中断的word文档,发现也能正常打开,当他把文件另存为后,再运行程序发现程序就可以正常往下运行了。他感觉很奇怪,就找我来帮他分析一下原因。
一、问题分析(以下日志和代码均是重现问题后输出的)
首先登录服务器,找到程序的运行日志,打开当天运行的日志文件,查看是否有错误日志,果然发现了错误日志,具体内容如下:
java.lang.IllegalArgumentException: The document is really a OOXML file
at org.apache.poi.hwpf.HWPFDocumentCore.verifyAndBuildPOIFS(HWPFDocumentCore.java:123)
at org.apache.poi.hwpf.extractor.WordExtractor.<init>(WordExtractor.java:51)
at com.file.util.readword.redWordText(Test.java:25)
at com.file.util.readword.main(Test.java:77)
根据错误日志不难分析出是解析doc文件报错了,根据错误日志可以直接定位到错位代码所在位置,通过反编译工具可以查看它的源码,源码具体如下(看到下面的代码,小伙伴们是否确定了问题的原因了?):
public static String redWordText(String filePath) {
File file=new File(filePath);
String fileName=file.getName();//获取文件名
String suffix = fileName.substring(fileName.indexOf("."), fileName.length());//获取文件后缀
String text="";
InputStream is = null;
try {
is = new FileInputStream(filePath);
if (StringUtils.equals(suffix, ".doc")) {// 解析doc文件
WordExtractor ex = new WordExtractor(is);
text = ex.getText();
ex.close();
} else if (StringUtils.equals(suffix, ".docx")) {// 解析docx文件
XWPFDocument doc = new XWPFDocument(is);
XWPFWordExtractor extractor = new XWPFWordExtractor(doc);
text = extractor.getText();
extractor.close();
}
} catch (Exception e) {
e.printStackTrace();
}finally {
if (is != null) {
try {
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return text;
}
当我看到源码后,基本确定了问题出现的原因。
二、原因分析
客户收集上来的文件,渠道是多样的,有些docx文件的后缀被强制修改成了doc后缀,这些修改后的文件还是可以正常打开的。当使用StringUtils.equals(suffix, ".doc")这种直接判断后缀的方式来判断文件类型是返回true的,导致docx文件使用了doc的解析方式,所以报错了。
三、解决办法
针对上面的问题可以使用FileMagic.valueOf(is) == FileMagic.OLE2来判断是否是doc格式文件,具体实现代码如下:
public static String redWordText1(String filePath) {
String text = "";
InputStream is = null;
try {
is = new FileInputStream(filePath);
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();
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if (is != null) {
try {
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return text;
}
四、其他存在的问题
当客户收集的文件的后缀被改成了大写,这种直接判断后缀的方法就无法判断了,需要在判断前把后缀统一成小写。
五、总结
通过上面的分析,小伙伴们以后判断word、excel文件格式时,一定要注意尽量避免直接使用后缀直接判断,推荐使用org.apache.poi.poifs.filesystem.FileMagic类进行判断(ps:专业的事情交给专业的来处理),否则一不小心就挖坑,导致后面的小伙伴又得加班填坑了。#头号有新人#
猜你喜欢
- 2024-12-17 松勤软件测试:丢掉Excel,手把手教你用Python操作Excel
- 2024-12-17 Excel数据还可这样来查询:用SQL查询输出工作表指定区域更高效!
- 2024-12-17 Pandas:一个高性能的数据分析Python库
- 2024-12-17 《github精选系列》——数据可视化分析平台DataGear
- 2024-12-17 测试驱动技术(TDD)系列之5:从excel中读取数据
- 2024-12-17 Python读取与写入Excel模块:openpyxl
- 2024-12-17 基于java的开源BI可视化工具——DataGear使用教程
- 2024-12-17 将Excel表格直接导出成JSON文件格式的一个小工具
- 2024-12-17 深入解析 EasyExcel 组件原理与应用
- 2024-12-17 数据分析的常用工具有哪些?Excel和BI如何选择
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- java反编译工具 (77)
- java反射 (57)
- java接口 (61)
- java随机数 (63)
- java7下载 (59)
- java数据结构 (61)
- java 三目运算符 (65)
- java对象转map (63)
- Java继承 (69)
- java字符串替换 (60)
- 快速排序java (59)
- java并发编程 (58)
- java api文档 (60)
- centos安装java (57)
- java调用webservice接口 (61)
- java深拷贝 (61)
- 工厂模式java (59)
- java代理模式 (59)
- java.lang (57)
- java连接mysql数据库 (67)
- java重载 (68)
- java 循环语句 (66)
- java反序列化 (58)
- java时间函数 (60)
- java是值传递还是引用传递 (62)
本文暂时没有评论,来添加一个吧(●'◡'●)