Я пытаюсь удалить строку текста из текстового файла без копирования во временный файл. Я пытаюсь сделать это, используя Printwriter и Scanner и заставляя их одновременно проходить файл, писатель записывает то, что читает Scanner, и перезаписывает каждую строку одним и тем же, пока не доберется до строки, которую я хочу удалять. Затем я продвигаю сканер, но не писатель, и продолжаю, как раньше. Вот код:
Но сначала параметры: Имена моих файлов — числа, так что это будет читаться как 1.txt или 2.txt и т. д., поэтому f указывает имя файла. Я конвертирую его в строку в конструкторе файла. Int n — это индекс строки, которую я хочу удалить.
public void deleteLine(int f, int n){
try{
Scanner reader = new Scanner(new File(f+".txt"));
PrintWriter writer = new PrintWriter(new FileWriter(new File(f+".txt")),false);
for(int w=0; w<n; w++)
writer.write(reader.nextLine());
reader.nextLine();
while(reader.hasNextLine())
writer.write(reader.nextLine());
} catch(Exception e){
System.err.println("Enjoy the stack trace!");
e.printStackTrace();
}
}
Это дает мне странные ошибки. В трассировке стека написано «NoSuchElementException» и «строка не найдена». Он указывает на разные линии; кажется, что любой из вызовов nextLine() может сделать это. Можно ли удалить строку таким образом? Если да, то что я делаю неправильно? Если нет, то почему? (Кстати, на всякий случай, если вам это нужно, текстовый файл составляет около 500 строк. Я не знаю, считается ли это большим или даже имеет значение.)