Заменить строку в файле - PullRequest
23 голосов
/ 30 июня 2010

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

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();
}

Однако я хочу сделать замену на месте и не думаю, что у меня могут быть открыты Reader and Writer наодин и тот же файл одновременно.Кроме того, я использую Java 1.4, поэтому у меня нет доступа к NIO, сканеру и т. Д.

Спасибо, Дон

Ответы [ 2 ]

31 голосов
/ 30 июня 2010

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

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

2 голосов
/ 30 июня 2010

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...