Чтение и запись в один и тот же файл с использованием try-with-resources
Я пытаюсь сделать программу, которая получает указанный String
и удаляет каждый случай этого String
в текстовом документе. Текстовый файл, который используется для чтения / записи, одинаков. Используемые аргументы получены из cmd в следующем порядке:
inputString filename
Программа компилируется нормально, но после запуска оставляет исходный текстовый файл пустым. Если я создаю блок try-catch для обработки ввода и блок try-catch для обработки вывода, я могу читать и записывать в один и тот же файл. Если я использую блок try-with-resources, я могу прочитать файл и сохранить результат в файл, отличный от оригинала, при всех случаях inputString
из cmd удален. Но кажется, что я не могу читать и писать в один и тот же файл, используя try-with-resources, а также input.hasNext()
утверждение возвращает ложь, когда я пытаюсь сделать это таким образом.
Пример кода ниже:
package ch12;
import java.io.*;
import java.util.*;
public class Chapter_12_E11_RemoveText {
public static void main(String[] args) throws Exception {
if (args.length != 2) {
System.out.println("Usage java ch12.Chapter_12_E11_RemoveText inputString filename");
System.exit(1);
}
File filename = new File(args[1]);
if (!filename.exists()) {
System.out.println("Target file " + args[1] + " does not exist");
System.exit(2);
}
try (
Scanner input = new Scanner(filename);
PrintWriter output = new PrintWriter(filename);
) {
System.out.println("hasNext() is " + input.hasNext());
System.out.println("hasNextLine() is " + input.hasNextLine());
while (input.hasNext()) {
String s1 = input.nextLine();
System.out.println("String fetched from input.nextLine() " + s1);
System.out.println("Attemping to replace all words equal to " + args[0] + " with \"\"");
String s2 = s1.replaceAll(args[0], "");
output.println(s2);
}
}
}
}
Я подозреваю, что когда я создаю новый PrintWriter
объект с аргументом filename
исходный файл перезаписывается пустым файлом перед while-loop
выполняет. Я здесь? Можно ли читать и записывать в один и тот же файл, используя try-with-resources?
1 ответ
Из документов PrintWriter:
Если файл существует, он будет обрезан до нулевого размера; в противном случае будет создан новый файл.
Таким образом, вы правы, к тому времени, когда вы инициализируете PrintWriter
, ваш Scanner
нечего сканировать
Я бы удалил PrintWriter
инициализация из блока инициализации ресурсов, создайте свое представление файла в памяти, затем замените содержимое файла в другом блоке (или вложите его).
То есть, если файл имеет разумный размер для вашей памяти, чтобы справиться с заменой.