【问题标题】:Strings written to file do not preserve line breaks写入文件的字符串不保留换行符
【发布时间】:2021-10-28 16:11:19
【问题描述】:

我正在尝试编写来自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 的输入?是否可以识别换行符?

标签: java string file newline


【解决方案1】:

来自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,我无法想象这个字符串会非常大,所以它可能在大多数情况下都可以正常工作
【解决方案2】:

请参阅以下有关如何正确处理换行符的问题。

How do I get a platform-dependent new line character?

基本上你想用

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

然后使用 newLineChar 代替 "\n"

【讨论】:

    【解决方案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.";
    

    【讨论】:

    • 我从 JTextArea 获取字符串,是否必须手动识别换行符并插入 line.separator?这是唯一的方法吗? :(
    • 可能有比这更好的方法,但听起来那个解决方案对你有用。
    【解决方案4】:

    如果您希望将 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);
    

    【讨论】:

      【解决方案5】:

      如果您使用的是 BufferedWriter,您还可以使用 .newline() 方法根据您的平台重新添加换行符。

      查看相关问题:Strings written to file do not preserve line breaks

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-08-20
        • 1970-01-01
        • 2010-11-11
        • 2014-04-18
        • 2018-08-21
        • 1970-01-01
        相关资源
        最近更新 更多