写入文件的字符串不能保留换行符
我正在尝试编写一个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();
}
}
出了什么问题?如何解决这个问题?谢谢你的帮助!
文本将有\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));
}
}
uhm,堆叠所有这些读取器来做简单的替换?'string.replace(“\\ n”,System.getProperty(“ line.separator“));' – unbeli 2012-02-08 19:06:38
@unbeli,如果字符串很短,替换是很快的,对于很长的字符串,上面的方法很好,我已经测试过了。 – Ahamed 2012-02-08 20:30:20
@unbeli - 'String.replace()'需要创建一个新的对象,暂时使内存需求增加一倍,所以对于大量数据来说这并不理想。虽然被授予了,但来自'JTextArea'的数据,我无法想象这个字符串会非常大,所以它可能在大多数情况下也同样适用 – 2012-02-08 20:46:53
我刚刚运行了你的程序,并在你的换行符(\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.";
我从JTextArea获取字符串,是否必须手动识别换行符并插入'line.separator'?这是唯一的方法吗? :( – Ahamed 2012-02-08 18:50:40
可能有比这更好的方法,但听起来像这样的解决方案会对你有用 – 2012-02-08 19:03:48
请参阅如何妥善处理换行符以下问题被发现。
How do I get a platform-dependent new line character?
基本上你想使用
String newLineChar = System.getProperty("line.separator");
,然后使用,而不是newLineChar “\ n” 从JTextArea
如果您正在使用的BufferedWriter,你也可以使用.newline()方法重新添加一个基于换行符你的平台。
请参阅此相关的问题:Strings written to file do not preserve line breaks
是您的控制台的大小和JTeaxtArea相同的大小? – MozenRath 2012-02-08 18:30:56
如果不是,那么可能是因为你需要\ r \ n for windows新行 – MozenRath 2012-02-08 18:31:30
Eclipse控制台和JTextArea是750x400像素。如果我必须添加\ r \ n,我该如何处理来自JTextArea的输入?是否有可能确定换行符? – Ahamed 2012-02-08 18:38:16