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

Jam*_*sev 8 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;
Run Code Online (Sandbox Code Playgroud)

正如预期的那样,当XML格式正确时,测试将通过,方法将返回true.如果发生错误并且无法解析文件,则返回false.

但是,当我们处理格式错误的XML(仍然是XML)文件时,这会中断.

我宁愿不依赖.xml扩展(一直失败),<?xml version="1.0" encoding="UTF-8"?>在文件中寻找字符串等.

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

有什么办法看到里面的文件,以"怀疑它可能会XML虽然DocumentException被抓了".这是解析目的所必需的.

rjd*_*olb 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);
Run Code Online (Sandbox Code Playgroud)

对于xml文件,我得到了'application/xml'

对于属性文件,我得到'text/plain'

但是,你可以为新的Tika添加一个探测器()

<dependency>
    <groupId>org.apache.tika</groupId>
    <artifactId>tika-core</artifactId>
    <version>1.xx</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)