如何可靠地检测文件类型?
目标:给定文件,确定它是否是给定类型(XML,JSON,属性等)
考虑XML的情况 – 在我们遇到这个问题之前,以下示例方法工作正常:
try { saxReader.read(f); } catch (DocumentException e) { logger.warn(" - File is not XML: " + e.getMessage()); return false; } return true;
正如所料,当XML格式良好时,测试将通过,方法将返回true。 如果发生错误并且无法解析文件,则返回false。
但是,当我们处理格式错误的XML(仍然是XML)文件时,这会中断。
我宁愿不依赖.xml
扩展(一直失败),在文件中查找 string等。
还有另一种方法可以处理吗?
您需要在文件中看到“怀疑它可能是XML
尽管DocumentException
被捕获”。 这是解析目的所必需的。
文件类型检测工具:
- Mime类型检测实用程序
- DROID(数字记录对象识别)
- ftc – 文件类型分类器
- JHOVE , JHOVE2
- NLNZ元数据提取工具
- 阿帕奇塔卡
- TrID , TrIDNet
- Oracle Outside In (商业)
- 法医创新文件调查员工具 (商业)
Apache Tika给我的问题最少,与Java 7不同,它不是特定于平台的: Files.probeContentType
import java.io.File; import java.io.IOException; import javax.activation.MimeType; import org.apache.tika.Tika; File inputFile = ... String type = new Tika().detect(inputFile); System.out.println(type);
对于xml文件,我得到了’application / xml’
对于属性文件,我得到’text / plain’
但是,你可以为新的Tika添加一个探测器()
org.apache.tika tika-core 1.xx
对于那些不需要非常精确检测的人( rjdkolb提到的Java 7的Files.probeContentType方法)
Path filePath = Paths.get("/path/to/your/file.jpg"); String contentType = Files.probeContentType(filePath);