2017-02-04 9 views
1

Ich versuche, eine bestimmte Zeile aus einer Datei zu entfernen. Aber ich habe ein Problem beim Löschen einer bestimmten Zeile aus der Textdatei. Lassen gesagt, ich meine Textdatei in der Datei entfernen Blueberry möge folgende:Entfernen einer bestimmten Zeile aus der Textdatei

Alte Liste Textdatei:

Chocolate 
Strawberry 
Blueberry 
Mango 

Neue Liste Textdatei:

Chocolate 
Strawberry 
Mango 

Ich versuchte, meine Java zu laufen Programm, wenn ich zum Löschen eingeben und es die Zeile nicht aus der Textdatei entfernt.

Ausgang: Bitte löschen: d Blueberry Remove: Blueberry

Wenn ich meine Textdatei öffnen, halten Sie es mit dem Wort "Blueberry" nur auf Looping.

Textdatei:

Blueberry 
Blueberry 
Blueberry 
Blueberry 
Blueberry 
Blueberry 
Blueberry 
Blueberry 

Meine Frage ist, wie die spezifische Zeile aus der Textdatei löschen?

Hier ist mein Java-Code:

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

Sie lesen nur die erste Zeile, Sie lesen nie eine der anderen Zeilen in der Datei ... – MadProgrammer

+1

Ich sehe nicht, wo Sie 'lineToRemove' auf etwas anderes als leer setzen. Sie sollten lineToRemove auf die Zeile setzen, die der Benutzer eingegeben hat. –

Antwort

1

Lassen Sie uns an Ihren Code einen kurzen Blick ...

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

Grundsätzlich lesen Sie die erste Zeile der Datei und dann wiederholt vergleichen mit der lineToRemove, für immer. Diese Schleife wird nie zum Beenden

Dies ist ein Beweis des Konzepts, müssen Sie es an Ihre Bedürfnisse anpassen.

Im Grunde, was Sie brauchen, Sie tun, um sicherzustellen, ist, dass Sie jede Zeile der Eingabedatei gerade lesen, bis es keine weiteren Zeilen sind

// 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(); 
} 

Werfen Sie einen Blick auf Basic I/O und The try-with-resources Statement für einige mehr Details

0

Das Lesen von Eingaben von der Konsole, das Lesen von Dateien und das Schreiben in eine Datei müssen getrennt voneinander ausgeführt werden. Sie können die Datei nicht gleichzeitig lesen und schreiben. Sie lesen nicht einmal Ihre Datei. Sie vergleichen nur Ihre Konsoleneingabe auf unbestimmte Zeit in Ihrer while-Schleife. Tatsächlich setzen Sie Ihren lineTobeRemoved nicht einmal auf die Eingabezeile. Hier ist eine Möglichkeit, es zu tun.

Algorithmus:

Lesen Sie die Konsole Eingang (Ihre Zeile zu löschen), dann starten Sie die Datei zu lesen und suchen nach Linie durch einen Vergleich mit dem Eingabezeile zu löschen. Wenn die Zeilen nicht übereinstimmen, speichern Sie die gelesene Zeile in einer Variablen. Andernfalls werfen Sie diese Zeile, da Sie sie löschen möchten. Sobald das Lesen abgeschlossen ist, beginnen Sie mit dem Schreiben der gespeicherten Zeilen in der Datei. Jetzt haben Sie die Datei mit einer entfernten Zeile aktualisiert.

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

Der abschließende 'if (br.readLine() == null)' Test ist sinnlos. Es kann nichts anderes sein, da es in der while-Schleife bereits null zurückgegeben hat. Und wenn es magisch nicht null zurückgibt, werfen Sie beide es weg und schließen die Ausgabe nie. – EJP

+0

@EJP Das stimmt. Ich aktualisiere es. – hhafeez

+0

Auch Vorsicht '\ n' funktioniert nicht auf oder Plattformen;) – MadProgrammer

Verwandte Themen