Java: Как сохранить CR при перезаписи файла?

1

Я пытаюсь переписать файл с изменениями. Для этой задачи я использую следующий код:

FileReader reader = new FileReader(file);
BufferedReader br = new BufferedReader(reader);
String line;
StringBuilder builder = new StringBuilder();
while((line = br.readLine()) != null) {
    builder.append(line);
}
builder.delete(0, 3);
FileWriter writer = new FileWriter(file);
writer.write(builder.toString());
writer.flush();
writer.close();

Но мой код удаляет все символы CR (конец строки), и я получаю

bbb ccc

вместо

bbb ccc Как я могу сказать Java, чтобы пропустить удаление символов CR?

  • 0
    этот br.readLine() читает строку, без CR LF. следовательно, когда вы объединяете результаты последовательных вызовов br.readLine() , вы теряете эти знаки. Это файл. Вы можете прочитать все сразу, см. Stackoverflow.com/questions/14169661/… (так как в любом случае вы помещаете весь файл в память)
Теги:

4 ответа

2
Лучший ответ

Не используя br.readline(), который, кажется, читает строку и удаляет разрыв трейлинг-строки, или вставляя его обратно, прежде чем добавлять его в построитель строк.

EDIT: здесь документация BufferedReader.readLine(), в которой четко указывается, что она удаляет ваш разрыв в конце строки.

0

Как упоминалось в других ответах, вы не должны использовать readLine для этих файловых операций, чтобы сохранить переводы строк и возврат каретки.
Но, кроме работы с небольшими файлами, я бы также не рекомендовал хранить содержимое всего файла внутри буфера (byte [], StringBuilder,...).

Вот простой пример, чтобы показать, как скопировать файл по-прежнему с пропуском некоторых ведущих байтов (например, в вашем примере). В зависимости от дальнейших манипуляций, которые вы хотите сделать, вы можете увеличить байтбуфер в соответствии с вашими потребностями, но вы должны проверить количество считанных байтов.

public class FileCopyTest {

    public static void main(String[] args) throws IOException {
        copyFile(3,"c:/file.txt","c:/fileCopy.txt");
    }


    public static void copyFile(int skipFirst, String src, String dst) throws IOException {
        int toSkip = skipFirst;
        try (FileInputStream fileIn = new FileInputStream(src); 
             FileOutputStream fileOut = new FileOutputStream(dst)) {
            byte read[] = new byte[1];
            while (-1 < fileIn.read(read, 0, 1)) {
                if(toSkip > 0 ) {
                    toSkip--;
                    continue;
                }
                fileOut.write(read,0,1);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
0

Я предлагаю это решение

    byte[] bytes = Files.readAllBytes(Paths.get(file));
    try (FileOutputStream out = new FileOutputStream(file)) {
        out.write(bytes, 3, bytes.length - 3);
    }
0

Когда вы добавите новую строку, добавьте \n:

while((line = br.readLine()) != null) {
    builder.append(line);
    builder.append("\n");
}

Независимая от платформы новая строка будет

builder.append(System.getProperty("line.separator"));

Смотрите также:

Ещё вопросы

Сообщество Overcoder
Наверх
Меню