如何可靠地检测文件类型?

目标:给定文件,确定它是否是给定类型(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);