2012-02-08 10 views
19

Próbuję napisać String (długa, ale zapakowana), która jest z JTextArea. Kiedy ciąg jest drukowany na konsoli, formatowanie jest takie samo jak w przypadku Text Area, ale kiedy zapisuję je do pliku przy użyciu BufferedWriter, to jest to pisanie w jednej linii jako String.Napisy zapisane do pliku nie zachowują podziałów wierszy

następujący fragment można go odtworzyć:

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(); 
    } 
} 

Co poszło nie tak? Jak rozwiązać ten problem? Dzięki za pomoc!

+0

były wielkości konsoli i wielkość swojej JTeaxtArea samo? – MozenRath

+2

jeśli nie, to prawdopodobnie dlatego, że potrzebujesz \ r \ n dla nowej linii Windows – MozenRath

+0

Konsola Eclipse i JTextArea mają wymiary 750 x 400 pikseli. Jeśli muszę dodać \ r \ n, jak mam zrobić dane wejściowe z JTextArea? Czy możliwe jest zidentyfikowanie podziałów linii? – Ahamed

Odpowiedz

18

Tekst z JTextArea będzie miał \n znaki do nowej linii, niezależnie od platforma, na której działa. Będziesz chciał zamienić te znaki na newline specyficzny dla platformy podczas pisania go do pliku (w przypadku Windows jest to \r\n, o czym wspomnieli inni).

Myślę, że najlepszym sposobem na to jest zawinąć tekst do BufferedReader, który może być używany do iteracji nad wierszami, a następnie użyć PrintWriter napisać każdą linię do pliku za pomocą nowej linii danej platformy . Istnieje krótsze rozwiązanie obejmujące string.replace(...) (patrz komentarz Unbeli), ale jest wolniejsze i wymaga więcej pamięci.

Oto moje rozwiązanie - teraz się jeszcze prostsze dzięki nowym funkcji w 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, układanie tych wszystkich czytelników, aby zrobić prostą wymianę? 'String.replace („\\ n”, (” System.getProperty line.separator "));' – unbeli

+0

@unbeli, Wymiana jest szybka, jeśli String jest krótki, dla bardzo długich łańcuchów, powyższe podejście jest dobre, jednak testowałem je. – Ahamed

+1

@unbeli - 'String.replace()' wymaga utworzenia nowego obiektu, który tymczasowo podwaja wymagania pamięci, więc nie jest idealny dla dużych ilości danych. Choć przyznane, z danymi pochodzącymi z 'JTextArea', nie mogę sobie wyobrazić, że string byłby strasznie duży, więc prawdopodobnie działałby równie dobrze w większości –

3

Właśnie uruchomiłem twój program i dodałem powrót karetki (\r) zanim twoja nowa linia (\n) zrobiła dla mnie sztuczkę.

Jeśli chcesz dostać separator niezależny układ linii, można znaleźć w propery systemu 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

Otrzymuję String z JTextArea, czy muszę ręcznie identyfikować podziały wierszy i wstawiać 'line.separator'? Czy to jedyny sposób? :( – Ahamed

+0

Nie może być lepsze sposoby niż, ale to brzmi jak to rozwiązanie działa dla Ciebie. –

Powiązane problemy