写入文件的字符串不保留换行符

Posted

技术标签:

【中文标题】写入文件的字符串不保留换行符【英文标题】:Strings written to file do not preserve line breaks 【发布时间】:2012-03-01 05:40:09 【问题描述】:

我正在尝试编写来自JTextAreaString(冗长但已包装)。当字符串打印到控制台时,格式与 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);

【讨论】:

以上是关于写入文件的字符串不保留换行符的主要内容,如果未能解决你的问题,请参考以下文章

【C语言】向文件写入东西不能写入换行

Shell 脚本写入文件换行的问题

如何在String readAllBytes中保留换行符

将带有换行符的字符串写入文件

关于c++文件流读入和写入的问题

php: 怎么让写入的字符串自动换行(在文本里面)?用fwrite()写入