Чтение и запись в один и тот же файл с использованием 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 инициализация из блока инициализации ресурсов, создайте свое представление файла в памяти, затем замените содержимое файла в другом блоке (или вложите его).

То есть, если файл имеет разумный размер для вашей памяти, чтобы справиться с заменой.

Другие вопросы по тегам