Подтвердить что ты не робот

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

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

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

4b9b3361

Ответ 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));
    }
}

Ответ 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.";