我试图写一个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();
    }
}

什么地方出了错?如何解决呢?谢谢你的帮助!

最佳答案

来自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));
    }
}

09-10 06:43
查看更多