2017-02-04 2 views
1

Я пытаюсь удалить определенную строку из файла. Но у меня есть проблема с удалением определенной строки из текстового файла. Давайте сказал, мой текстовый файл, я хочу, чтобы удалить черника в файле следующее:Удалить конкретную строку Из текстового файла

Старый текстовый файл со списком:

Chocolate 
Strawberry 
Blueberry 
Mango 

Новый список Текстовый файл:

Chocolate 
Strawberry 
Mango 

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

Выход: Пожалуйста, удалите: d Blueberry Снимите: Blueberry

Когда я открываю текстовый файл, сохранить на перекручивание со словом "Blueberry" только.

Текстовый файл:

Blueberry 
Blueberry 
Blueberry 
Blueberry 
Blueberry 
Blueberry 
Blueberry 
Blueberry 

Мой вопрос заключается в том, чтобы удалить определенную строку из текстового файла?

Вот мой Java-код:

String input="Please delete: "; 
System.out.println(input); 

try 
     {   
      BufferedReader reader = new BufferedReader 
        (new InputStreamReader (System.in)); 
      line = reader.readLine(); 

      String inFile="list.txt"; 
      String line = ""; 


      while(!line.equals("x")) 
      { 
       switch(line) 
       {     

        case "d": 

        line = reader.readLine(); 
        System.out.println("Remove: " + line); 
        String lineToRemove=""; 

        FileWriter removeLine=new FileWriter(inFile); 
        BufferedWriter change=new BufferedWriter(removeLine); 
        PrintWriter replace=new PrintWriter(change); 

        while (line != null) { 
         if (!line.trim().equals(lineToRemove)) 
         { 
          replace.println(line); 
          replace.flush(); 
         } 
        } 
        replace.close(); 
        change.close(); 
        break; 

       } 
       System.out.println(input); 
       line = reader.readLine(); 


      } 

     } 
     catch(Exception e){ 
      System.out.println("Error!"); 
     } 
+0

Вы только что прочитали первую строчку, вы никогда не читали ни одну из других строк в файле ... – MadProgrammer

+1

Я не вижу, где вы устанавливаете 'lineToRemove' для чего-либо, кроме пустого. Вы должны установить lineToRemove на строку, введенную пользователем. –

ответ

1

Давайте бросим быстрый взгляд на свой код ...

line = reader.readLine(); 
//... 
while (line != null) { 
    if (!line.trim().equals(lineToRemove)) 
    { 
     replace.println(line); 
     replace.flush(); 
    } 
} 

В принципе, вы читали первую строку файла, а затем повторно сравнить его с lineToRemove, навсегда. Эта петля никогда не выйдет

Это доказательство концепции, вам нужно будет изменить ее в соответствии с вашими потребностями.

В принципе, то, что вам нужно убедиться, что вы делаете, это вы читаете каждую строку входного файла до тех пор, пока не останется больше линий

// All the important information 
String inputFileName = "..."; 
String outputFileName = "..."; 
String lineToRemove = "..."; 
// The traps any possible read/write exceptions which might occur 
try { 
    File inputFile = new File(inputFileName); 
    File outputFile = new File(outputFileName); 
    // Open the reader/writer, this ensure that's encapsulated 
    // in a try-with-resource block, automatically closing 
    // the resources regardless of how the block exists 
    try (BufferedReader reader = new BufferedReader(new FileReader(inputFile)); 
      BufferedWriter writer = new BufferedWriter(new FileWriter(outputFile))) { 
     // Read each line from the reader and compare it with 
     // with the line to remove and write if required 
     String line = null; 
     while ((line = reader.readLine()) != null) { 
      if (!line.equals(lineToRemove)) { 
       writer.write(line); 
       writer.newLine(); 
      } 
     } 
    } 

    // This is some magic, because of the compounding try blocks 
    // this section will only be called if the above try block 
    // exited without throwing an exception, so we're now safe 
    // to update the input file 

    // If you want two files at the end of his process, don't do 
    // this, this assumes you want to update and replace the 
    // original file 

    // Delete the original file, you might consider renaming it 
    // to some backup file 
    if (inputFile.delete()) { 
     // Rename the output file to the input file 
     if (!outputFile.renameTo(inputFile)) { 
      throw new IOException("Could not rename " + outputFileName + " to " + inputFileName); 
     } 
    } else { 
     throw new IOException("Could not delete original input file " + inputFileName); 
    } 
} catch (IOException ex) { 
    // Handle any exceptions 
    ex.printStackTrace(); 
} 

взглянуть на Basic I/O и The try-with-resources Statement более некоторые подробности

0

Чтение ввода с консоли, чтение файла и запись в файл необходимо различать и выполнять отдельно. вы не можете читать и писать файл одновременно. вы даже не читаете свой файл. вы просто сравниваете свой консольный ввод неопределенно в своем цикле while. Фактически, вы даже не устанавливаете свой lineTobeRemoved в строку ввода. Вот один из способов сделать это.

Алгоритм:

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

public static void main(String args[]) { 
    String input = "Please delete: "; 
    System.out.println(input); 

    try { 
     BufferedReader reader = new BufferedReader(new InputStreamReader(
       System.in)); 
     String line = reader.readLine(); 
     reader.close(); 

     String inFile = "list.txt"; 


       System.out.println("Remove: " + line); 
       String lineToRemove = line; 


       StringBuffer newContent = new StringBuffer(); 

       BufferedReader br = new BufferedReader(new FileReader(inFile)); 
       while ((line = br.readLine()) != null) { 
        if (!line.trim().equals(lineToRemove)) { 
         newContent.append(line); 
         newContent.append("\n"); // new line 

        } 
       } 
        br.close(); 

       FileWriter removeLine = new FileWriter(inFile); 
       BufferedWriter change = new BufferedWriter(removeLine); 
       PrintWriter replace = new PrintWriter(change); 
       replace.write(newContent.toString()); 
       replace.close(); 

    } 

    catch (Exception e) { 
     e.printStackTrace(); 
    } 

} 
+0

Окончательный 'if (br.readLine() == null)' test бессмыслен. Это не может быть ничего, поскольку он уже возвратил null в цикле 'while'. И если это волшебным образом не возвращает нуль, вы оба бросаете его и никогда не закрываете выход. – EJP

+0

@EJP Правильно. Я обновляю его. – hhafeez

+0

Также остерегайтесь '\ n' не работает или на платформах;) – MadProgrammer

Смежные вопросы