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

时间:2012-02-08 18:25:50

标签: java string file newline

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

出了什么问题?怎么解决这个?谢谢你的帮助!

5 个答案:

答案 0 :(得分:18)

来自JTextArea的文字将为换行符添加\n个字符,无论其运行的平台如何。当您将这些字符写入文件时,您将希望将这些字符替换为特定于平台的换行符(对于Windows,这是\r\n,正如其他人所提到的那样。)

我认为最好的方法是将文本包装成BufferedReader,可用于迭代行,然后使用PrintWriter将每行写入a文件使用特定于平台的换行符。有一个较短的解决方案涉及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));
    }
}

答案 1 :(得分:7)

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

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

基本上你想用

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

然后使用newLineChar而不是“\ n”

答案 2 :(得分:3)

我刚刚运行了你的程序,并在换行符(\r)之前添加了一个回车符{\n)。

如果您想获得一个独立于系统的行分隔符,可以在系统中找到一个line.separator

String separator = System.getProperty("line.separator");
String string = "This is lengthy string that contains many words. So" + separator
            + "I am wrapping it.";

答案 3 :(得分:0)

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

请参阅此相关问题:Strings written to file do not preserve line breaks

答案 4 :(得分:0)

如果希望保留回车符,请将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);