写入文件的字符串不保留换行符
Posted
技术标签:
【中文标题】写入文件的字符串不保留换行符【英文标题】:Strings written to file do not preserve line breaks 【发布时间】:2012-03-01 05:40:09 【问题描述】:我正在尝试编写来自JTextArea
的String
(冗长但已包装)。当字符串打印到控制台时,格式与 Text Area
中的格式相同,但是当我使用 BufferedWriter 将它们写入文件时,它是在单行中写入 String
。
按照sn-p可以复现:
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();
出了什么问题?如何解决这个问题?感谢您的帮助!
【问题讨论】:
控制台的大小和 JTeaxtArea 的大小一样吗? 如果不是,那么可能是因为您需要 \r\n 用于 windows 换行 Eclipse 控制台和 JTextArea 为 750x400 像素。如果我必须添加 \r\n,我该如何处理来自 JTextArea 的输入?是否可以识别换行符? 【参考方案1】:我刚刚运行了您的程序,并在您的换行符 (\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
?这是唯一的方法吗? :(
可能有比这更好的方法,但听起来那个解决方案对你有用。【参考方案2】:
请参阅以下有关如何正确处理换行符的问题。
How do I get a platform-dependent new line character?
基本上你想用
String newLineChar = System.getProperty("line.separator");
然后使用 newLineChar 代替 "\n"
【讨论】:
【参考方案3】:来自JTextArea
的文本将有\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));
【讨论】:
呃,把这些阅读器堆起来做简单的替换?string.replace("\\n", System.getProperty("line.separator"));
@unbeli,如果字符串很短,替换很快,对于非常长的字符串,上述方法适用。不过我已经测试过了。
@unbeli - String.replace()
需要创建一个新对象,这会暂时使内存需求增加一倍,因此它不适合处理大量数据。虽然被允许,但数据来自JTextArea
,我无法想象这个字符串会非常大,所以它可能在大多数情况下都可以正常工作【参考方案4】:
如果您使用的是 BufferedWriter,您还可以使用 .newline() 方法根据您的平台重新添加换行符。
查看相关问题:Strings written to file do not preserve line breaks
【讨论】:
【参考方案5】:如果您希望将 Java 字符串中的回车符保存到文件中。只需按照以下语句替换每个换行符(在 java 中识别为:\n):
Temphtml = TempHtml.replaceAll("\n", "\r\n");
这是一个代码示例,
// When Execute button is pressed
String TempHtml = textArea.getText();
TempHtml = TempHtml.replaceAll("\n", "\r\n");
try (PrintStream out = new PrintStream(new FileOutputStream("C:/Temp/temp.html")))
out.print(TempHtml);
catch (FileNotFoundException e)
// TODO Auto-generated catch block
e.printStackTrace();
System.out.println(TempHtml);
【讨论】:
以上是关于写入文件的字符串不保留换行符的主要内容,如果未能解决你的问题,请参考以下文章