2012-02-08 58 views
19

我正在尝试编写一个String(冗长但包裹),它是从JTextArea。当打印到控制台的字符串时,格式与在Text Area中的格式相同,但是当我使用BufferedWriter将它们写入文件时,它将以单行形式写入String写入文件的字符串不能保留换行符

下面的代码片段可以重现:

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

出了什么问题?如何解决这个问题?谢谢你的帮助!

+0

是您的控制台的大小和JTeaxtArea相同的大小? – MozenRath 2012-02-08 18:30:56

+2

如果不是,那么可能是因为你需要\ r \ n for windows新行 – MozenRath 2012-02-08 18:31:30

+0

Eclipse控制台和JTextArea是750x400像素。如果我必须添加\ r \ n,我该如何处理来自JTextArea的输入?是否有可能确定换行符? – Ahamed 2012-02-08 18:38:16

回答

18

文本将有\n字符换行,不管它运行的平台。当您将其写入文件时,您将需要用特定于平台的换行符替换这些字符(对于Windows,这是\r\n,如其他人所述)。

我认为最好的方法是将文本包装到BufferedReader中,该文件可用于遍历行,然后使用PrintWriter将每行写出到使用特定于平台的换行符的文件中。有一个较短的解决方案,涉及string.replace(...)(请参阅Unbeli的评论),但速度较慢,需要更多内存。

这里是我的解决方案 - 现在的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,堆叠所有这些读取器来做简单的替换?'string.replace(“\\ n”,System.getProperty(“ line.separator“));' – unbeli 2012-02-08 19:06:38

+0

@unbeli,如果字符串很短,替换是很快的,对于很长的字符串,上面的方法很好,我已经测试过了。 – Ahamed 2012-02-08 20:30:20

+1

@unbeli - 'String.replace()'需要创建一个新的对象,暂时使内存需求增加一倍,所以对于大量数据来说这并不理想。虽然被授予了,但来自'JTextArea'的数据,我无法想象这个字符串会非常大,所以它可能在大多数情况下也同样适用 – 2012-02-08 20:46:53

3

我刚刚运行了你的程序,并在你的换行符(\n)之前添加了一个回车符(\r)为我做了诡计。

如果你想获得一个系统的独立行分隔符,可以在系统属性格式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获取字符串,是否必须手动识别换行符并插入'line.separator'?这是唯一的方法吗? :( – Ahamed 2012-02-08 18:50:40

+0

可能有比这更好的方法,但听起来像这样的解决方案会对你有用 – 2012-02-08 19:03:48

相关问题