2012-03-16 22 views
6

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

+0

均田相关:http://stackoverflow.com/questions/3600222/code-for-identifying-programming-language-in-a-text-file – PeterK 2012-03-16 14:03:44

+0

你可以用” t得到一个明确的答案“什么k文件是否是?“,仅限于”我可以假装它是X型吗?“ (对于零个或更多个X,答案可以是“是”,而不仅仅是零或一个)。但是你可以抛出统计数据,看看是否有很多''<\w+>'(可能是XML),许多''w +“'(可能是JSON)与令牌的总数相比,否则它可能是属性。 – harold 2012-03-16 15:12:05

回答

6

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的”

您可以将探测器但是添加到新提卡()

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

对于那些谁也不需要非常精确的检测(在的Java 7的文件通过rjdkolb提到.probeContentType法)

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

嗨,在win7 64位,使用jdk1.8,上述方法返回null为所有文件类型。这是一个openjdk错误,在这些地方提到 - https://bugs.openjdk.java.net/browse/JDK -8080369 – svk 2017-01-03 12:52:30