Я ищу способ заменить строку в файле, не читая целый файл в память. Обычно я использовал бы Средство чтения и Устройство записи, т.е. что-то как следующее:
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, Сканеру, и т.д.
Спасибо, Дон
Замена «на месте» обычно невозможна для файлов, если только длина замены не совпадает с длиной оригинала. В противном случае файл должен был бы увеличиваться, перетасовывая все последующие байты «вправо», или уменьшаться. Обычный способ сделать это - прочитать файл, записать замену во временный файл, а затем заменить исходный файл временным.
Это также имеет то преимущество, что рассматриваемый файл всегда находится либо в исходном состоянии, либо в полностью замененном состоянии, а не в промежуточном состоянии.
Для замены чего-либо в файле или потоке требуется Writer или OutputStream, который может удалять и вставлять байты в любую позицию. Операция замены может быть разделена на операцию удаление и операцию вставку .
Глядя на API OutputStream и Writer, я не могу найти подходящих методов. Можно использовать OutputStream для записи байтов со смещением, но это просто перезапишет существующий контекст. Таким образом, это может сработать для особого случая, когда оригинал и замена имеют одинаковую длину.
Итак, сейчас я думаю, что запись отредактированных строк во временный файл с последующей заменой исходного файла временным файлом все еще является лучшим решением.