Saltar al contenido

¿Cómo uso System.getProperty(“line.separator”).toString()?

Después de consultar con expertos en esta materia, programadores de diversas ramas y maestros dimos con la solución al problema y la plasmamos en esta publicación.

Solución:

El problema

Debes NO suponga que un archivo de texto de entrada arbitrario utiliza el separador de nueva línea “correcto” específico de la plataforma. Esta parece ser la fuente de su problema; tiene poco que ver con expresiones regulares.

Para ilustrar, en la plataforma Windows, System.getProperty("line.separator") es "rn" (CR+LF). Sin embargo, cuando ejecuta su código Java en esta plataforma, es posible que tenga que lidiar con un archivo de entrada cuyo separador de línea es simplemente "n" (LF). Tal vez este archivo se creó originalmente en la plataforma Unix y luego se transfirió en modo binario (en lugar de texto) a Windows. Puede haber muchos escenarios en los que puede encontrarse con este tipo de situaciones, donde debe analizar un archivo de texto como entrada que no usa el separador de nueva línea de la plataforma actual.

(Casualmente, cuando un archivo de texto de Windows se transfiere a Unix en modo binario, muchos editores mostrarían ^M lo que confundió a algunas personas que no entendían lo que estaba pasando).

Cuando estás productor un archivo de texto como salida, probablemente debería preferir el separador de nueva línea específico de la plataforma, pero cuando está consumidor un archivo de texto como entrada, probablemente no sea seguro asumir que utiliza correctamente el separador de nueva línea específico de la plataforma.


La solución

Una forma de resolver el problema es usar, por ejemplo java.util.Scanner. Tiene un nextLine() método que puede devolver la siguiente línea (si existe), manejando correctamente cualquier inconsistencia entre el separador de nueva línea de la plataforma y el archivo de texto de entrada.

También puedes combinar 2 Scanner, uno para escanear el archivo línea por línea y otro para escanear los tokens de cada línea. Aquí hay un ejemplo de uso simple que divide cada línea en una List. Por lo tanto, todo el archivo se convierte en un List>.

Este es probablemente un mejor enfoque que leer todo el archivo en un enorme String y entonces split en líneas (que luego son split en partes).

    String text
        = "row1tblahtblahtblahn"
        + "row2t1t2t3t4rn"
        + "row3tAtBtCr"
        + "row4";

    System.out.println(text);
    //  row1    blah    blah    blah
    //  row2    1   2   3   4
    //  row3    A   B   C
    //  row4

    List> input = new ArrayList>();

    Scanner sc = new Scanner(text);
    while (sc.hasNextLine()) 
        Scanner lineSc = new Scanner(sc.nextLine()).useDelimiter("t");
        List line = new ArrayList();
        while (lineSc.hasNext()) 
            line.add(lineSc.next());
        
        input.add(line);
    
    System.out.println(input);
    // [[row1, blah, blah, blah], [row2, 1, 2, 3, 4], [row3, A, B, C], [row4]]

Ver también

  • Efectivo Java 2.ª edición, artículo 25: Preferir listas a arreglos

Preguntas relacionadas

  • Validando la entrada usando java.util.Scanner – tiene muchos ejemplos de uso
  • Escáner frente a StringTokenizer frente a String.Split

Probar

rows = tabDelimitedTable.split("[" + newLine + "]");

Esto debería resolver el expresiones regulares problema.

Tampoco es tan importante, pero devuelve el tipo de

System.getProperty("line.separator")

es Cuerda así que no es necesario llamar a toString().

En Windows, line.separator es una combinación CR/LF (referencia aquí).

el Java String.split() El método toma una expresión regular. Así que creo que hay algo de confusión aquí.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)


Tags : / /

Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *