Чтение и запись в файл одновременно на 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 является то, что вам не нужно дисковое пространство для временного выходного файла, и может получить небольшую лучшую производительность диска из-за лучшего доступа к местности.