2016-05-27 22 views
0

Ich versuche, ein Programm, das eine angegebene String empfängt, und entfernt jedes Auftreten dieser String in einem Textdokument. Die Textdatei, die zum Lesen/Schreiben verwendet wird, ist identisch. Die Argumente verwendet werden, von cmd empfangen werden, in dieser Reihenfolge:Lesen und Schreiben in die gleiche Datei mit try-with-resources

inputString filename 

Das Programm stellt in Ordnung, aber es bleibt die ursprüngliche Textdatei leer, nachdem ausgeführt wird. Wenn ich einen try-catch-Block für die Eingabeverarbeitung und einen try-catch-Block für die Ausgabeverarbeitung verwende, kann ich in dieselbe Datei lesen und schreiben. Wenn ich einen try-with-resources-Block verwende, kann ich eine Datei lesen und die Ausgabe in eine andere Datei als das Original speichern, wobei alle Vorkommen inputString von cmd entfernt sind. Aber es scheint, als ob ich mit try-with-resources nicht in dieselbe Datei lesen und schreiben kann, und auch die input.hasNext()-Anweisung gibt false zurück, wenn ich versuche, es so zu machen.

Code-Beispiel unten:

package ch12; 
import java.io.*; 
import java.util.*; 

public class Chapter_12_E11_RemoveText { 

    public static void main(String[] args) throws Exception { 

     if (args.length != 2) { 
      System.out.println("Usage java ch12.Chapter_12_E11_RemoveText inputString filename"); 
      System.exit(1); 
     } 

     File filename = new File(args[1]); 
     if (!filename.exists()) { 
      System.out.println("Target file " + args[1] + " does not exist"); 
      System.exit(2); 
     } 

     try (
      Scanner input = new Scanner(filename); 
      PrintWriter output = new PrintWriter(filename); 
     ) { 

      System.out.println("hasNext() is " + input.hasNext()); 
      System.out.println("hasNextLine() is " + input.hasNextLine()); 

      while (input.hasNext()) { 

       String s1 = input.nextLine(); 
       System.out.println("String fetched from input.nextLine() " + s1); 
       System.out.println("Attemping to replace all words equal to " + args[0] + " with \"\""); 
       String s2 = s1.replaceAll(args[0], ""); 
       output.println(s2); 
      } 
     } 

    } 
} 

Ich Verdacht besteht, dass, wenn ich ein neues PrintWriter Objekt mit dem Argument filename, die ursprüngliche Datei durch eine leere Datei, bevor die while-loop ausführt erstellen überschrieben wird. Bin ich hier? Ist es möglich, mit try-with-resources in dieselbe Datei zu schreiben und zu lesen?

+0

Als Duplikat mit falschem Duplikat geschlossen. Wieder geöffnet. – Mena

Antwort

2

Vom Printwriter docs:

Wenn die Datei vorhanden ist, dann wird es auf die Größe Null gekürzt werden; Andernfalls wird eine neue Datei erstellt.

So sind Sie richtig, durch die Zeit, die Sie Ihre PrintWriter initialisieren, Ihre Scanner nichts zu scannen hat.

Ich würde die PrintWriter Initialisierung aus dem Ressourceninitialisierungsblock entfernen, Ihre Dateidarstellung im Speicher erstellen und dann den Dateiinhalt in einem anderen Block ersetzen (oder verschachteln).

Das heißt, wenn die Datei eine angemessene Größe für Ihren Speicher hat, um den Ersatz zu behandeln.

+0

Danke für die Antwort, wahrscheinlich hätte ich das alleine herausfinden sollen;) – Esben86

+0

@ Esben86 du bist willkommen. Du hast es irgendwie herausgefunden :) – Mena