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

时间:2012-03-16 13:58:15

标签: java algorithm file-type

目标:给定文件,确定它是否属于给定类型(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扩展(一直失败),在文件中查找<?xml version="1.0" encoding="UTF-8"?>字符串等。

还有另一种方法可以处理吗?

你必须在文件中看到“怀疑XML虽然DocumentException被抓住了”。解析时需要这样做。

3 个答案:

答案 0 :(得分:9)

答案 1 :(得分:7)

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

<dependency>
    <groupId>org.apache.tika</groupId>
    <artifactId>tika-core</artifactId>
    <version>1.xx</version>
</dependency>

答案 2 :(得分:2)

对于那些不需要非常精确检测的人(rjdkolb提到的 Java 7&#39; Files.probeContentType 方法)

Path filePath = Paths.get("/path/to/your/file.jpg");
String contentType = Files.probeContentType(filePath);