2012-03-16 14 views
6

Objetivo: dado el archivo, determinar si se trata de un tipo determinado (XML, JSON, propiedades, etc)¿Cómo detectar de manera confiable los tipos de archivos?

Considere el caso de XML - Hasta nos encontramos con este tema, el siguiente enfoque de la muestra funcionó bien:

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

Como se esperaba, cuando XML está bien formado, la prueba pasaría y el método volvería a ser cierto. Si sucede algo malo y no se puede analizar el archivo, se devolverá falso.

Esto se rompe sin embargo cuando tratamos con un archivo XML mal formado (aún XML).

prefiero no confiar en .xml extensión (falla todo el tiempo), buscando <?xml version="1.0" encoding="UTF-8"?> cadena dentro del archivo, etc.

¿Hay otra manera esto puede ser manejado?

Lo que debería ver dentro del archivo para "sospechar que puede ser XML aunque DocumentException fue capturado". Esto es necesario para el análisis sintáctico.

+0

Un poco relacionados: http://stackoverflow.com/questions/3600222/code-for-identifying-programming-language-in-a-text-file – PeterK

+0

Usted puede' obtener una respuesta definitiva a "qué k ind of file is it? ", solo para" ¿puedo pretender que es de tipo X? " (la respuesta puede ser "sí" a cero o más X, no solo cero o uno).Pero puede agregar estadísticas y ver si hay muchas '<\w+>' (probablemente XML), muchas '" \ w + "' (probablemente JSON) en comparación con el número total de tokens y, de lo contrario, podrían ser propiedades. – harold

Respuesta

6

Apache Tika me da la menor cantidad de problemas y no es específica de la plataforma a diferencia de 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); 

Para un archivo xml Tengo 'application/xml'

de un archivo de propiedades Tengo 'text/plain'

Sin embargo, puede añadir un detector para el nuevo Tika()

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

Para aquellos que no necesitan de detección muy precisa (la Java 7 de Archivos .probeContentType método mencionado por rjdkolb)

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

Hola, en win7 de 64 bits, usando jdk1.8, el método anterior devuelve null para todos los tipos de archivos. Esto es un error de openjdk como se menciona en estos lugares - https://bugs.openjdk.java.net/browse/JDK -8080369 – svk

Cuestiones relacionadas