Строки, записанные в файл, не сохраняют разрывы строк - PullRequest
19 голосов
/ 08 февраля 2012

Я пытаюсь написать 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 ]

18 голосов
/ 08 февраля 2012

Текст из 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));
    }
}
7 голосов
/ 08 февраля 2012

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

Как получить символ новой строки в зависимости от платформы?

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

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

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

3 голосов
/ 08 февраля 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.";
0 голосов
/ 26 июня 2018

Если вы хотите сохранить символы возврата каретки из строки 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);
0 голосов
/ 09 февраля 2016

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

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

...