2015-03-11 5 views
0

Я пытаюсь удалить текстовую строку из файла. Пока у меня это есть, но это дает мне некоторые проблемы. Он работает, если после исходного текста на строке ничего нет. Но если в текстовом файле у меня есть что-то после Барта, например, Барта Джонса, он не удалит строку, он просто оставит ее в покое. Пожалуйста помоги.Удаление строки текста с определенной строкой внутри нее

public void removeLineFromFile(String file, String lineToRemove) { 

    try { 

     File inFile = new File(file); 

     if (!inFile.isFile()) { 
      System.out.println("Parameter is not an existing file"); 
      return; 
     } 

     //Construct the new file that will later be renamed to the original filename. 
     File tempFile = new File(inFile.getAbsolutePath() + ".tmp"); 

     BufferedReader br = new BufferedReader(new FileReader(file)); 
     PrintWriter pw = new PrintWriter(new FileWriter(tempFile)); 

     String line = null; 

     //Read from the original file and write to the new 
     //unless content matches data to be removed. 
     while ((line = br.readLine()) != null) { 

      if (!line.trim().equals(lineToRemove)) { 

       pw.println(line); 
       pw.flush(); 
      } 
     } 
     pw.close(); 
     br.close(); 

     //Delete the original file 
     if (!inFile.delete()) { 
      System.out.println("Could not delete file"); 
      return; 
     } 

     //Rename the new file to the filename the original file had. 
     if (!tempFile.renameTo(inFile)) 
      System.out.println("Could not rename file"); 

    } 
    catch (FileNotFoundException ex) { 
     ex.printStackTrace(); 
    } 
    catch (IOException ex) { 
     ex.printStackTrace(); 
    } 
} 

public static void main(String[] args) { 
    FileUtil util = new FileUtil(); 
    util.removeLineFromFile("booklist.txt", "bart"); 
} 

} `

ответ

1

Это связано с тем, как вы ищете для строки в файле , Цель состоит в том, чтобы удалить строку, содержащую строку, а не «равную» строке. Изменение инструкции if в цикле должно сделать трюк.

if (!line.trim().toLowerCase().contains(lineToRemove.toLowerCase())) { 

      pw.println(line); 
      pw.flush(); 
     } 

Обратите внимание, что я также добавил вызов toLowerCase() в случае, если строка поиска и содержание строки, где в разных случаях, вы, вероятно, хотите, чтобы удалить их. Если это не так, вы можете безопасно удалить эти вызовы.

1

Вместо .equals(lineToRemove) использование .contains(lineToRemove)

1

Просто измените

if (!line.trim().equals(lineToRemove)) 

с

if (!line.indexOf(lineToRemove) > -1) 
  • Нет необходимости обрезать, поскольку вы хотите знать, находится ли строка в строке.
  • indexOf генерировать меньше байт-кода тогда contains как содержит себя звонок indexOf с другими планки.
  • Возможно, вы захотите сравнить, используя toLowerCase, если вы не имеете значения.

Смотрите Is String.Contains() faster than String.IndexOf()? для получения дополнительной информации по сравнению с indexOf против contains.

+0

'String # contains' ... – m0skit0

+0

@ m0skit0' содержит 'сам индекс вызова с другими плагинами ... –

+1

Эффективность козыри удобочитаемости, за исключением случаев, наиболее чувствительных к производительности. Я бы использовал String #, поскольку он делает намерение понятным, а не indexOf. –

1

Вы должны использовать не equals но contains в этой строке:

if (!line.trim().equals(lineToRemove)) { 

Как это:

if (!line.contains(lineToRemove)) { 
Смежные вопросы