如何可靠地检测文件类型? [重复]

问题描述 投票:0回答:3

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

java algorithm file-type
3个回答

11
投票

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
投票

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

Path filePath = Paths.get("/path/to/your/file.jpg");
String contentType = Files.probeContentType(filePath);
© www.soinside.com 2019 - 2024. All rights reserved.