Подтвердить что ты не робот

Заменить строку в файле

Я ищу способ заменить строку в файле, не читая весь файл в памяти. Обычно я использовал бы Reader и 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 и Writer в одном файле. Кроме того, я использую Java 1.4, поэтому не имею доступа к NIO, сканеру и т.д.

Спасибо, Дон

4b9b3361

Ответ 1

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

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

Ответ 2

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

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

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