Pregunta

Todo,

Estoy intentando identificar archivos de texto plano con los finales de línea de Mac y, dentro de un InputStream, en silencio les convierte a finales de línea de Windows o Linux (la parte importante es el carácter LF, en realidad). En concreto, estoy trabajando con varias APIs que toman InputStreams y son difíciles bloqueada para buscar \ n como saltos de línea.

A veces, se obtienen archivos binarios. Obviamente, un archivo que no es un texto similar no debería haber hecho esta sustitución, ya que el valor que le pasa a corresponder a \ r obviamente, no puede ser en silencio seguido de un \ n sin destrozando cosas mal.

Estoy intentando utilizar java.net.URLConnection.guessContentTypeFromStream y sólo realizar conversiones línea final si el tipo es text / plain. Por desgracia, "text/plain" no parece estar en su gama de valores de retorno; todo lo que consigo es null para mis archivos de texto plano, y no es posiblemente seguro asumir todos los archivos no identificables pueden ser modificados.

¿Qué mejor biblioteca (preferentemente en un repositorio público Maven y de código abierto) puedo utilizar para hacer esto? Por otra parte, ¿cómo puedo hacer el trabajo guessContentTypeFromStream para mí? Sé que estoy describiendo una aplicación intrínsecamente peligrosos y ninguna solución puede ser perfecto, pero me limito a tratar "nula" de probabilidades de ser "text / plain" y yo simplemente necesito escribir más código a mí mismo para buscar evidencia de que ISN 't?

¿Fue útil?

Solución

Me parece que lo que está pidiendo es determinar si un archivo es de texto o no. Dado que, hay una solución aquí que parece derecha:

Por supuesto, él está hablando de Unix, bash y Perl, pero el concepto es el mismo:

A menos que inspeccionar cada byte de la archivo, no se va a conseguir este 100%. Y hay una gran actuación golpeado con la inspección de cada byte. Pero después de algunos experimentos, que se establecieron en un algoritmo que funciona para mí. yo examinar la primera línea y declarar la archivo sea binaria incluso si encuentro un byte no textual. Parece un poco holgura, lo sé, pero me parece alejarse con ella.

editar # 1:
Ampliando este tipo de solución, que parece un enfoque razonable sería asegurar el archivo no contiene caracteres no ASCII (a menos que usted está tratando con archivos que no son Inglés ... eso es otra solución). Esto podría hacerse mediante la comprobación de si el contenido del archivo como una cadena no coincide con esto:

// -- uses commons-io
String fileAsString = FileUtils.readFileToString( new File( "file-name-here" ) );
boolean isTextualFile = fileAsString.matches( ".*\\p{ASCII}+.*" );

editar # 2
Es posible que desee probar esto como su expresión regular, o algo parecido. Sin embargo, voy a admitir que probablemente podría utilizar algo de refinación.

".*(?:\\p{Print}|\\p{Space})+.*"
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top