Чтение и запись в файл одновременно на java
Я читаю файл строка за строкой, и я пытаюсь сделать так, чтобы, если я доберусь до строки, которая соответствует моим конкретным параметрам (в моем случае, если она начинается с определенного слова), я могу перезаписать эту строку.
мой текущий код:
try {
FileInputStream fis = new FileInputStream(myFile);
DataInputStream in = new DataInputStream(fis);
BufferedReader br = new BufferedReader(new InputStreamReader(in));
String line;
while ((line = br.readLine()) != null) {
System.out.println(line);
if (line.startsWith("word")) {
// replace line code here
}
}
} catch (Exception ex) {
ex.printStackTrace();
}
...где myFile
это
2 ответов
ваш лучший выбор здесь, вероятно, будет читать в файле в память (что-то вроде StringBuilder
) и написание того, как вы хотите, чтобы ваш выходной файл выглядел в StringBuilder
. После того, как вы закончите чтение в файле полностью, вы захотите записать содержимое StringBuilder
в файл.
если файл слишком большой, чтобы выполнить это в памяти, вы всегда можете прочитать содержимое файла построчно и записать их во временный файл вместо StringBuilder
. После этого вы можете удалить старый файл и переместить временный на его место.
RandomAccessFile Кажется, хорошо подходят. Его javadoc говорит:
экземпляров этого класса поддерживают чтение и запись в файл произвольного доступа. Файл произвольного доступа ведет себя как большой массив байтов, хранящихся в файловой системе. Существует своего рода курсор или индекс в подразумеваемый массив, называемый указателем файла; входные операции считывают байты, начиная с указателя файла, и продвигают указатель файла мимо прочитанных байтов. Если файл произвольного доступа созданные в режиме чтения / записи, также доступны операции вывода; операции вывода записывают байты, начиная с указателя файла, и продвигают указатель файла мимо записанных байтов. Выходные операции, которые пишут после текущего конца подразумеваемого массива, приводят к расширению массива. Указатель файла может быть прочитан методом getFilePointer и установлен методом seek.
тем не менее, поскольку текстовые файлы являются последовательным форматом файлов, вы не можете заменить строку строкой разная длина без перемещения всех последующих символов, поэтому замена строк будет в целом равносильна чтению и записи всего файла. Это может быть проще сделать, если вы пишете в отдельный файл и переименовываете выходной файл после завершения. Это также более надежно в случае, если что-то пойдет не так, так как можно просто повторить попытку с содержимым исходного файла. Единственным преимуществом RandomAccessFile является то, что вам не нужно дисковое пространство для временного выходного файла, и может получить небольшую лучшую производительность диска из-за лучшего доступа к местности.