2010-10-27 4 views
6

estoy usando Java SE 6.¿Hay una API estándar para verificar los separadores de línea en Java?

Mi programa lee varios tipos de archivos que van de dos a UNIX y ASCII a Unicode, y tengo que asegurarse de que los separadores de línea para el archivo de salida coinciden con los archivos de entrada.

La forma en que hago esto es que leo una línea de muestra con la función BufferedReader read() para buscar el primer separador de línea y guardar ese separador de línea en una cadena. De esta manera, puede usarse más adelante siempre que necesite una nueva línea.

He inspeccionado la clase escáner y se dio cuenta de que los posibles separadores de línea pueden incluir los siguientes:

\r\n 
\r 
\n 
\u2028 
\u2029 
\u0085 

¿Hay una función de biblioteca para comprobar si estos personajes? O incluso mejor, ¿ya existe una función de biblioteca para comprobar cómo se ve el separador de línea de la entrada?

¿Hay alguna otra forma de evitar esto?

EDIT: Si es posible, me gustaría utilizar la API estándar de Java en lugar de bibliotecas de terceros, pero todas las sugerencias son bienvenidas.

EDITAR: Solo para aclarar.
1) Los archivos de entrada no dependen de dónde se está ejecutando este programa. Por ejemplo, si estoy ejecutando este programa en Dos, aún puedo obtener un archivo de entrada de Unix.
2) Mi objetivo no es leer cada línea delimitada con separadores de línea, eso es simple. Lo que realmente necesito es escribir un archivo de salida con los mismos separadores de línea que el archivo de entrada. Por ejemplo, si estoy ejecutando este programa en Dos, y obtengo un archivo de entrada de Unix, quiero poder escribir mi archivo de salida con separadores de línea Unix. Es por esto que estoy preguntando si hay una API estándar para detectar separadores de línea basados ​​en archivos de entrada, en lugar de ejecutar el sistema operativo.

Gracias.

Respuesta

3

Las tres respuestas anteriores en realidad no abordan la pregunta. El OP desea determinar a partir de un archivo determinado: ¿cuál es el separador de línea utilizado en este archivo?

Esta pregunta no puede responderse definitivamente para un archivo dado, ya que el archivo podría estar utilizando varias terminaciones de línea. Esto puede parecer artificial, pero es posible.

Así que el mejor enfoque para mí parece ser analizar el archivo de entrada usted mismo, contar las ocurrencias de posibles secuencias de caracteres que terminan en línea y elegir el que aparece más a menudo como el separador de línea de este archivo.

No he encontrado una biblioteca que implemente esta funcionalidad.

+1

"puede parecer artificioso" - Definitivamente no es un caso extremo, por ejemplo, archivos de registro Java Unix con respuestas de mainframe o textos copiados y pegados de diferentes fuentes. Nunca asumiría que un archivo tiene solo un tipo de separador de línea. –

1

BufferedReader y readLine() manejan automáticamente al menos las tres primeras variantes de los marcadores de fin de línea.

+0

Creo que esta es la mejor solución, no hay necesidad de hardcode esos \ ny \ r cosas. – user1686407

0

He buscado durante mucho tiempo una API para esto. Pero no pude encontrar

Uso un enfoque similar para leer el delimitador de la primera línea con una expresión regular.

Tuve que pasar algún tiempo para obtener la Regex correcta para trabajar y deseé que esta respuesta tuviera un código para ella. Así que terminé escribiendo algo yo mismo:

/** 
* <h1> Identify which line delimiter is used in a string </h1> 
* 
* This is useful when processing files that were created on different operating systems. 
* 
* @param str - the string with the mystery line delimiter. 
* @return the line delimiter for windows, {@code \r\n}, <br> 
*   unix/linux {@code \n} or legacy mac {@code \r} <br> 
*   if none can be identified, it falls back to unix {@code \n} 
*/ 
public static String identifyLineDelimiter(String str) { 
    if (str.matches("(?s).*(\\r\\n).*")) {  //Windows //$NON-NLS-1$ 
     return "\r\n"; //$NON-NLS-1$ 
    } else if (str.matches("(?s).*(\\n).*")) { //Unix/Linux //$NON-NLS-1$ 
     return "\n"; //$NON-NLS-1$ 
    } else if (str.matches("(?s).*(\\r).*")) { //Legacy mac os 9. Newer OS X use \n //$NON-NLS-1$ 
     return "\r"; //$NON-NLS-1$ 
    } else { 
     return "\n"; //fallback onto '\n' if nothing matches. //$NON-NLS-1$ 
    } 
} 
Cuestiones relacionadas