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

+0

Вы можете» t получить окончательный ответ на «что k ind файла это? », только для« могу ли я притворяться, что это тип X? » (ответ может быть «да» на ноль или более X, а не только на ноль или один).Но вы можете бросить статистику и посмотреть, есть ли много из '<\w+>' (возможно, XML), много '' \ w + "' (вероятно, JSON) по сравнению с общим количеством токенов, и в противном случае это могут быть свойства. – harold

ответ

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»

для файла свойств я получил «текст/Plain»

Однако вы можете добавить детектор к новому Тика()

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

Для тех, кто не нуждается в очень точное обнаружение (в Java 7 в файлы .probeContentType метод упоминается rjdkolb)

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

 Смежные вопросы

  • Нет связанных вопросов^_^