Строки, записанные в файл, не сохраняют разрывы строк

Я пытаюсь написать 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();
    }
}

Что пошло не так? Как решить эту проблему? Спасибо за любую помощь!


person Ahamed    schedule 08.02.2012    source источник
comment
был ли размер вашей консоли и размер JTeaxtArea одинаковыми?   -  person MozenRath    schedule 08.02.2012
comment
если нет, то, вероятно, это потому, что вам нужно \ r \ n для новой строки Windows   -  person MozenRath    schedule 08.02.2012
comment
Консоль Eclipse и JTextArea имеют размер 750x400 пикселей. Если мне нужно добавить \ r \ n, как мне это сделать для ввода из JTextArea? Можно ли определить разрывы строк?   -  person Ahamed    schedule 08.02.2012


Ответы (5)


Текст из 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));
    }
}
person Kevin K    schedule 08.02.2012
comment
ммм, складывать все эти считыватели, чтобы сделать простую замену? string.replace("\\n", System.getProperty("line.separator")); - person unbeli; 08.02.2012
comment
@unbeli, замена выполняется быстро, если строка короткая, для очень длинных строк применим вышеуказанный подход. Хотя я это проверил. - person Ahamed; 09.02.2012
comment
@unbeli - String.replace() требует создания нового объекта, который временно удваивает требования к памяти, поэтому он не идеален для больших объемов данных. Хотя это разрешено, с данными, поступающими из JTextArea, я не могу представить, что строка будет ужасно большой, поэтому она, вероятно, будет работать так же хорошо по большей части - person Kevin K; 09.02.2012

См. Следующий вопрос о том, как правильно обрабатывать символы новой строки.

Как получить новую строку, зависящую от платформы персонаж?

В основном вы хотите использовать

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

а затем используйте newLineChar вместо "\ n"

person jluzwick    schedule 08.02.2012

Я только что запустил вашу программу, и добавление возврата каретки (\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.";
person nicholas.hauschild    schedule 08.02.2012
comment
Я получаю строку из JTextArea, мне нужно вручную определять разрывы строк и вставлять line.separator? Это единственный способ? :( - person Ahamed; 08.02.2012
comment
Могут быть способы получше, но похоже, что это решение подойдет вам. - person nicholas.hauschild; 08.02.2012

Если вы хотите сохранить символы возврата каретки из строки 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);
person QA Specialist    schedule 26.06.2018

Если вы используете BufferedWriter, вы также можете использовать . newline (), чтобы повторно добавить новую строку в зависимости от вашей платформы.

См. Этот связанный вопрос: Строки, записанные в файл, не сохраняют разрывы строк

person Christian Vielma    schedule 09.02.2016