2012-02-08 12 views
19

Estoy tratando de escribir un String (largo pero ajustado), que es de JTextArea. Cuando la cadena se imprime en la consola, el formateo es el mismo que en Text Area, pero cuando los escribo al archivo usando BufferedWriter, está escribiendo String en una sola línea.Las cadenas escritas en un archivo no conservan los saltos de línea

siguiente fragmento puede reproducirlo:

public class BufferedWriterTest { 
    public static void main(String[] args) throws IOException { 
     String string = "This is lengthy string that contains many words. So\nI am wrapping it."; 
     System.out.println(string); 
     File file = new File("C:/Users/User/Desktop/text.txt"); 
     FileWriter fileWriter = new FileWriter(file); 
     BufferedWriter bufferedWriter = new BufferedWriter(fileWriter); 
     bufferedWriter.write(string); 
     bufferedWriter.close(); 
    } 
} 

lo que salió mal? ¿Cómo resolver esto? ¡Gracias por cualquier ayuda!

+0

eran del tamaño de la consola y el tamaño de su JTeaxtArea la misma? – MozenRath

+2

si no, entonces probablemente sea porque necesita \ r \ n para Windows nueva línea – MozenRath

+0

Eclipse Console y JTextArea es 750x400 px. Si tengo que agregar \ r \ n, ¿cómo puedo hacer para obtener información de JTextArea? ¿Es posible identificar saltos de línea? – Ahamed

Respuesta

18

texto de un JTextArea tendrá \n caracteres para los saltos de línea, independientemente de la plataforma en la que se está ejecutando. Deberá reemplazar esos caracteres con la línea nueva específica de la plataforma a medida que la escribe en el archivo (para Windows, esto es \r\n, como han mencionado otros).

Creo que la mejor manera de hacerlo es envolver el texto en BufferedReader, que se puede usar para iterar sobre las líneas, y luego usar PrintWriter para escribir cada línea en un archivo usando la línea nueva específica de la plataforma . Hay una solución más corta que implica string.replace(...) (vea el comentario de Unbeli), pero es más lenta y requiere más memoria.

Aquí está mi solución - ahora hace aún más sencillo gracias a las nuevas características en Java 8:

public static void main(String[] args) throws IOException { 
    String string = "This is lengthy string that contains many words. So\nI am wrapping it."; 
    System.out.println(string); 
    File file = new File("C:/Users/User/Desktop/text.txt"); 

    writeToFile(string, file); 
} 

private static void writeToFile(String string, File file) throws IOException { 
    try (
     BufferedReader reader = new BufferedReader(new StringReader(string)); 
     PrintWriter writer = new PrintWriter(new FileWriter(file)); 
    ) { 
     reader.lines().forEach(line -> writer.println(line)); 
    } 
} 
+2

uhm, apilando todos estos lectores para hacer un reemplazo simple? 'String.replace (" \\ n ", System.getProperty (" line.separator "));' – unbeli

+0

@unbeli, el reemplazo es rápido si el String es corto, para cadenas mucho más largas, el enfoque anterior es bueno. Sin embargo, lo he probado. – Ahamed

+1

@unbeli - 'String.replace()' requiere la creación de un nuevo objeto, que duplica temporalmente los requisitos de memoria, por lo que no es ideal para grandes cantidades de datos. Aunque estoy de acuerdo, con los datos provenientes de un 'JTextArea', no puedo imaginar que el hilo sea terriblemente grande, por lo que probablemente funcione igual de bien en su mayor parte. –

3

Acabo de ejecutar su programa, y ​​agregando un retorno de carro (\r) antes de su nueva línea (\n) me convenció.

Si desea obtener un separador de sistema de línea independiente, se puede encontrar en el hotel fenomenal sistema de line.separator

String separator = System.getProperty("line.separator"); 
String string = "This is lengthy string that contains many words. So" + separator 
      + "I am wrapping it."; 
+0

Estoy obteniendo String de JTextArea, ¿tengo que identificar manualmente los saltos de línea e insertar 'line.separator'? ¿Es esa la única forma? :( – Ahamed

+0

Puede haber formas mejores que, pero parece que esa solución funcionaría para usted. –

Cuestiones relacionadas