usadas texto por manejo linea leer jerarquía guardar crear como clases binarios binario archivos archivo arbol java file text binary

por - ¿Determinando el tipo de archivo binario/texto en Java?



leer archivo java (10)

Echa un vistazo a la biblioteca JMimeMagic .

jMimeMagic es una biblioteca de Java para determinar el tipo MIME de archivos o secuencias.

A saber, ¿cómo le diría a un archivo (jar / rar / etc.) Archivo de un textual (xml / txt, independiente de la codificación)?


Hice este. Un poco más simple, pero para los idiomas latinos, debería funcionar bien, con el ajuste de la relación.

/** * Guess whether given file is binary. Just checks for anything under 0x09. */ public static boolean isBinaryFile(File f) throws FileNotFoundException, IOException { FileInputStream in = new FileInputStream(f); int size = in.available(); if(size > 1024) size = 1024; byte[] data = new byte[size]; in.read(data); in.close(); int ascii = 0; int other = 0; for(int i = 0; i < data.length; i++) { byte b = data[i]; if( b < 0x09 ) return true; if( b == 0x09 || b == 0x0A || b == 0x0C || b == 0x0D ) ascii++; else if( b >= 0x20 && b <= 0x7E ) ascii++; else other++; } if( other == 0 ) return false; return 100 * other / (ascii + other) > 95; }


No hay una manera garantizada, pero aquí hay un par de posibilidades:

1) Busque un encabezado en el archivo. Desafortunadamente, los encabezados son específicos del archivo, por lo que si bien es posible que pueda descubrir que se trata de un archivo RAR, no obtendrá la respuesta más genérica de si se trata de texto o binario.

2) Cuenta el número de caracteres vs. tipos de personajes. Los archivos de texto serán en su mayoría caracteres alfabéticos, mientras que los archivos binarios, especialmente los comprimidos, como rar, zip, y tal, tenderán a tener bytes más representados.

3) Busque un patrón de repetición periódica de repeticiones.


Para hacerte saber, he elegido un camino bastante diferente. En mi caso, solo hay 2 tipos de archivos, las posibilidades de que un archivo dado sea uno binario son altas. Asi que

  1. supongamos que el archivo es binario, intente hacer lo que se supone que debe hacerse (por ejemplo, deserializar)
  2. captura la excepción
  3. tratar el archivo como textual
  4. si eso falla, algo está mal con el archivo

Podrías probar la herramienta DROID .


Si el archivo consta de los bytes 0x09 (pestaña), 0x0A (alimentación de línea), 0x0C (alimentación de formulario), 0x0D (retorno de carro) o 0x20 a 0x7E, entonces probablemente sea texto ASCII.

Si el archivo contiene cualquier otro caracter de control ASCII, 0x00 a 0x1F excluyendo los tres anteriores, entonces probablemente sean datos binarios.

El texto UTF-8 sigue un patrón muy específico para cualquier byte con el bit de orden alto, pero las codificaciones de longitud fija como ISO-8859-1 no lo hacen. UTF-16 puede contener con frecuencia el byte nulo (0x00), pero solo en cualquier otra posición.

Necesitarías una heurística más débil para cualquier otra cosa.




Usé este código y funciona bastante bien para el texto en inglés y alemán:

private boolean isTextFile(String filePath) throws Exception { File f = new File(filePath); if(!f.exists()) return false; FileInputStream in = new FileInputStream(f); int size = in.available(); if(size > 1000) size = 1000; byte[] data = new byte[size]; in.read(data); in.close(); String s = new String(data, "ISO-8859-1"); String s2 = s.replaceAll( "[a-zA-Z0-9ßöäü//.//*!/"§//$//%&/()=//?@~''#:,;//"+ "+><//|//[//]//{//}//^°²³//// //n//r//t_//-`´âêîô"+ "ÂÊÔÎáéíóàèìòÁÉÍÓÀÈÌÒ©‰¢£¥€±¿»«¼½¾™ª]", ""); // will delete all text signs double d = (double)(s.length() - s2.length()) / (double)(s.length()); // percentage of text signs in the text return d > 0.95; }


Ejecutar file -bi {filename} . Si lo que devuelve comienza con ''text /'', entonces no es binario, de lo contrario lo es. ;-)