2012-03-16 53 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