Удалить строку из файла, используя Java - PullRequest
0 голосов
/ 29 октября 2018

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

Здесь я использую класс сканера для чтения файла и класс печатающего устройства в сочетании с FileWriter для записи во временный файл. Я хочу знать, какую ошибку я допустил в коде. Там нет синтаксических ошибок.

Здесь «u» - исходный файл, содержащий текст, тогда как «t» - временный файл, в который копируется содержимое файла, а затем переименовывается в исходный файл. В функции "int ldel - это индекс строки, которую нужно удалить. Предположим, что файл имеет вид:

  aaa
  bbb
  ccc

теперь, если значение ldel передано как 2, файл должен быть отформатирован как:

 aaa
 ccc 

Я много думал и не смог найти ни одной логической ошибки. Пожалуйста, скажите мне, если вы найдете один. Кодировка была следующей:

void deleteline(int ldel)throws IOException
{
   Scanner dr=new Scanner(u);
   FileWriter fwd= new FileWriter(t,true);
   PrintWriter pd= new PrintWriter(fwd,true);
   int c=0;
   while(dr.hasNextLine()==true)
   {
       c++;
       if(c!=ldel)
       pd.println(dr.nextLine());
       else if(c==ldel)
       continue;

    }
    t.renameTo(u);
    u.delete();
    dr.close();
    fwd.close();
    pd.close();
}     

Ответы [ 3 ]

0 голосов
/ 29 октября 2018

[1] Вы переименовываете файл с именем 't' в новое имя, 'u' .., а затем удаляете файл с именем 'u'. Это звучит неправильно.

[2] когда ваше 'if' пропускает оператор nextLine, вы вообще не потребляете строку, что означает, что вы все равно получаете ВСЕ строки в выходном файле. Таким образом, даже когда c == ldel, вам нужно вызвать .readLine (), чтобы избавиться от него.

[3] В разных файловых системах переименование открытого файла не работает. Закрытые вызовы должны быть сделаны до того, как вы переименуете.

[4] else if (ldel == c) 'излишне; просто «еще» будет делать. В этом отношении, продолжение является излишним, продолжить просто означает завершить цикл и вернуться к началу. Это буквально ничего не делает, если это последняя вещь в цикле. Это последняя вещь в вашем цикле. Избавиться от этого полностью. Это не меняет того, что делает ваш код, но делает его легче для понимания.

[5] при открытии файлов для чтения / записи. Вы должны быть откровенны в отношении кодировки. FileWriter не позволяет вам. Не используйте этот класс. Посмотрите на новый файловый API и используйте что-то вроде Files.newInputStream, обратите внимание, что вам придется изменить большую часть этого кода, чтобы использовать новый API, и это необязательное предложение по стилю.

[6] вы должны использовать конструкцию try-with-resources (поищите в интернете java try-with-resources, если вы не знаете, что это такое). Проблема с этим кодом в том, что он пропускает ресурсы при возникновении исключений. Для одноразового приложения (например, оно запускается, выполняет одно действие, а затем завершает работу) это не имеет значения, но если вы поместите этот код в более крупную конструкцию (скажем, например, это часть веб-сервера), оно ' со временем снесу всю ВМ. Лучше всего научиться открывать ресурсы с помощью конструкции try-with-resources.

0 голосов
/ 29 октября 2018

Хотя ваш код не является лучшей реализацией логики, если вы хотите исправить свой код, вы должны вызвать метод nextLine() в условии c==ldel, чтобы игнорировать строку. Так что ваш цикл должен быть таким:

   while(dr.hasNextLine()==true)
   {
       c++;
       if(c!=ldel)
           pd.println(dr.nextLine());
       else if(c==ldel)
       {
            dr.nextLine()
            continue;
       }


    }
0 голосов
/ 29 октября 2018

Вы должны вызвать nextLine(), даже если вы не хотите выводить его, иначе это будет обработано на следующей итерации цикла.

Измените цикл следующим образом:

while (dr.hasNextLine()) {
    c++;
    String line = dr.nextLine();
    if (c != ldel) {
        pd.println(line);
    }
}

Не нужно использовать continue.

Также я думаю, что вы должны удалить файл u перед переименованием t.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...