2012-03-16 28 views
6

Mục tiêu: cho tệp, xác định xem nó có thuộc loại đã cho (XML, JSON, Thuộc tính, v.v.)Cách phát hiện các loại tệp tin một cách đáng tin cậy?

Xem xét trường hợp XML - Lên cho đến khi chúng tôi gặp phải vấn đề này, cách tiếp cận mẫu sau đây hoạt động tốt:

try { 
     saxReader.read(f); 
    } catch (DocumentException e) { 
     logger.warn(" - File is not XML: " + e.getMessage()); 
     return false; 
    } 
    return true; 

Như dự kiến, khi XML được định dạng tốt, kiểm tra sẽ vượt qua và phương pháp sẽ trả về đúng sự thật. Nếu một cái gì đó xấu xảy ra và tập tin không thể được phân tích cú pháp, false sẽ được trả về.

Tuy nhiên, sự cố này xảy ra khi chúng tôi xử lý tệp XML không đúng định dạng (vẫn là XML).

Tôi không muốn dựa vào .xml mở rộng (không tất cả các thời gian), tìm kiếm <?xml version="1.0" encoding="UTF-8"?> chuỗi bên trong các tập tin, vv

Có một cách khác để điều này có thể bị xử lý?

Bạn sẽ phải xem gì bên trong tệp để "nghi ngờ có thể là XML mặc dù DocumentException đã bị bắt". Điều này là cần thiết cho mục đích phân tích cú pháp.

+0

Kinda liên quan: http://stackoverflow.com/questions/3600222/code-for-identifying-programming-language-in-a-text-file – PeterK

+0

Bạn có thể' t nhận được câu trả lời dứt khoát cho "k ind của tập tin là nó? ", chỉ để" tôi có thể giả vờ nó là loại X? " (câu trả lời có thể là "có" không hoặc nhiều hơn X, không chỉ bằng 0 hoặc một).Nhưng bạn có thể ném số liệu thống kê và xem có nhiều '<\w+> '(có thể là XML), nhiều' "\ w +" '(có lẽ là JSON) so với tổng số mã thông báo và nếu không nó có thể là thuộc tính. – harold

Trả lời

6

Apache Tika mang lại cho tôi số tiền ít nhất của vấn đề và không phải là nền tảng cụ thể không giống như 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); 

Đối tệp xml tôi nhận được 'application/xml'

cho một thuộc tính tập tin tôi 'text/plain'

Bạn tuy nhiên có thể thêm một Detector đến Tika mới()

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

Đối với những người không cần phát hiện rất chính xác (các Java 7 của tập tin .probeContentType phương pháp được đề cập bởi rjdkolb)

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

Xin chào, Trong win7 64-bit, sử dụng jdk1.8, phương thức trên trả về null cho tất cả các loại tệp. Đây có phải là lỗi openjdk như đã đề cập ở những nơi này không - https://bugs.openjdk.java.net/browse/JDK -8080369 – svk

Các vấn đề liên quan