Строка замены в файле

Я ищу способ заменить строку в файле, не читая целый файл в память. Обычно я использовал бы Средство чтения и Устройство записи, т.е. что-то как следующее:

public static void replace(String oldstring, String newstring, File in, File out)
    throws IOException {

    BufferedReader reader = new BufferedReader(new FileReader(in));
    PrintWriter writer = new PrintWriter(new FileWriter(out));
    String line = null;
    while ((line = reader.readLine()) != null)
        writer.println(line.replaceAll(oldstring,newstring));

    // I'm aware of the potential for resource leaks here. Proper resource
    // handling has been omitted in the interest of brevity
    reader.close();
    writer.close();
}

Однако я хочу сделать оперативную замену, и не думаю, что у меня могут быть Средство чтения и Устройство записи, открытое на том же файле одновременно. Кроме того, я использую Java 1.4, таким образом, dont't имеют доступ к NIO, Сканеру, и т.д.

Спасибо, Дон

23
задан Dónal 30 June 2010 в 08:36
поделиться

2 ответа

Замена «на месте» обычно невозможна для файлов, если только длина замены не совпадает с длиной оригинала. В противном случае файл должен был бы увеличиваться, перетасовывая все последующие байты «вправо», или уменьшаться. Обычный способ сделать это - прочитать файл, записать замену во временный файл, а затем заменить исходный файл временным.

Это также имеет то преимущество, что рассматриваемый файл всегда находится либо в исходном состоянии, либо в полностью замененном состоянии, а не в промежуточном состоянии.

31
ответ дан 29 November 2019 в 02:27
поделиться

Для замены чего-либо в файле или потоке требуется Writer или OutputStream, который может удалять и вставлять байты в любую позицию. Операция замены может быть разделена на операцию удаление и операцию вставку .

Глядя на API OutputStream и Writer, я не могу найти подходящих методов. Можно использовать OutputStream для записи байтов со смещением, но это просто перезапишет существующий контекст. Таким образом, это может сработать для особого случая, когда оригинал и замена имеют одинаковую длину.

Итак, сейчас я думаю, что запись отредактированных строк во временный файл с последующей заменой исходного файла временным файлом все еще является лучшим решением.

2
ответ дан 29 November 2019 в 02:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: