2012-02-08 17 views
19

String (uzun ama sarılmış) yazmayı deniyorum, JTextArea'dan. Dize konsola yazdırıldığında, biçimlendirme Text Area'dakiyle aynıdır, ancak bunları BufferedWriter kullanarak dosyaya yazdığımda, String'u tek satırda yazmaktadır.Dosyaya yazılan dizeler, satır sonlarını koruyamıyor

ardından pasajı üretebileceği:

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

Yanlış giden ne? Bunu nasıl çözebilirim? Herhangi bir yardım için teşekkürler!

+0

konsol boyutu ve JTeaxtArea aynı boyutu vardı:

bu ilgili soruya bakın? – MozenRath

+2

değilse, büyük olasılıkla bunun için \ r \ n pencereleri için yeni satır – MozenRath

+0

Eclipse Console ve JTextArea 750x400 px. Eğer \ r \ n eklemem gerekiyorsa, JTextArea'dan giriş için nasıl yaparım? Satır sonlarını tanımlamak mümkün mü? – Ahamed

cevap

18

Metin satırbaşıyla için \n karakter olacak

String newLineChar = System.getProperty("line.separator"); 

kullanmak ve daha sonra yerine newLineChar kullanmak istiyorum Platform üzerinde çalışıyor. Bu karakterleri platforma özgü yeni satırla dosyaya yazarken değiştirmek isteyeceksiniz (Windows için bu, diğerlerinin de belirttiği gibi \r\n).

Bunu yapmanın en iyi yolu, metni satırların üzerinde yinelemek için kullanılabilecek bir BufferedReader içine sarmak ve daha sonra platforma özgü yeni satırı kullanarak her satırı bir dosyaya yazmak için PrintWriter kullanın. . string.replace(...)'u içeren daha kısa bir çözüm var (bkz. Unbeli'nin yorumu), ancak daha yavaştır ve daha fazla bellek gerektirir. Eğer bir BufferedWriter kullanıyorsanız

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, tüm bu okuyucular basit değiştirme için istifliyor? 'String.replace (" \\ n ", System.getProperty (" line.separator "))' ' – unbeli

+0

@unbeli, String kısasa, yedek çok uzun dizeler için hızlıdır, yukarıdaki yaklaşım iyi durumdadır. – Ahamed

+1

@unbeli - 'String.replace()', bellek gereksinimini geçici olarak ikiye katlayan yeni bir nesne oluşturmayı gerektirir, bu nedenle büyük miktarda veri için ideal değildir. Her ne kadar bir JTextArea'dan gelen verilerle, dizenin çok büyük olacağını hayal bile edemiyorum, bu yüzden muhtemelen büyük ihtimalle aynı şekilde çalışacaktır. –

3

Programınızı çalıştırdım ve yeni satırınız (\n) benim için hile yapmadan önce bir satır başı (\r) ekledim.

bir sistem bağımsız hat ayırıcı almak istiyorsanız

, tek sistem propery 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

JTextArea'dan String alıyorum, satır sonlarını el ile tanımlamalı ve 'line.separator' öğesini girmem gerekiyor mu? Tek yol bu mu? :( – Ahamed

+0

Bundan daha iyi yollar olabilir, ancak bu çözüm sizin için işe yarayacak gibi geliyor: –

İlgili konular