【问题标题】:How to reliably detect file types? [duplicate]如何可靠地检测文件类型? [复制]
【发布时间】:2012-04-02 01:47:33
【问题描述】:

目标:给定文件,确定它是否属于给定类型(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 已被捕获”。这是解析目的所必需的。

【问题讨论】:

  • 对于“它是什么类型的文件?”,您无法得到明确的答案,只能回答“我可以假装它是 X 类型的吗?” (对零个或多个 X 的答案可以是“是”,而不仅仅是零或一)。但是您可以输入统计数据,看看与令牌总数相比是否有很多 <\w+>(可能是 XML)、很多 "\w+"(可能是 JSON),否则可能是属性。

标签: java algorithm file-type


【解决方案1】:
【解决方案2】:

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'

但是,您可以将 Detector 添加到新的 Tika()

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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

    • 您好,在win7 64位,使用jdk1.8,上述方法对所有文件类型都返回null。这是不是这些地方提到的openjdk bug - bugs.openjdk.java.net/browse/JDK-8080369
    • 这在某些 MAC OS 版本、Amazon Correto 8 Java 等上也会中断。我不建议使用它。
    猜你喜欢
    • 2012-01-26
    • 2015-01-15
    • 2012-08-10
    • 2016-10-04
    • 2012-04-09
    • 2017-07-13
    • 1970-01-01
    • 2013-01-08
    相关资源
    最近更新 更多