Я пытаюсь переписать файл с изменениями. Для этой задачи я использую следующий код:
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?
Не используя br.readline()
, который, кажется, читает строку и удаляет разрыв трейлинг-строки, или вставляя его обратно, прежде чем добавлять его в построитель строк.
EDIT: здесь документация BufferedReader.readLine()
, в которой четко указывается, что она удаляет ваш разрыв в конце строки.
Как упоминалось в других ответах, вы не должны использовать 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();
}
}
}
Я предлагаю это решение
byte[] bytes = Files.readAllBytes(Paths.get(file));
try (FileOutputStream out = new FileOutputStream(file)) {
out.write(bytes, 3, bytes.length - 3);
}
Когда вы добавите новую строку, добавьте \n
:
while((line = br.readLine()) != null) {
builder.append(line);
builder.append("\n");
}
Независимая от платформы новая строка будет
builder.append(System.getProperty("line.separator"));
Смотрите также:
br.readLine()
читает строку, без CR LF. следовательно, когда вы объединяете результаты последовательных вызововbr.readLine()
, вы теряете эти знаки. Это файл. Вы можете прочитать все сразу, см. Stackoverflow.com/questions/14169661/… (так как в любом случае вы помещаете весь файл в память)