2017-06-15 3 views
0

So kann diese oder auch nicht eine dumme Frage, aber hier gehen wir! Ich versuche, eine Datei zu schreibenSchreiben in Dateien Ausgabe

So und es nicht außer Kraft setzen, aber es schreibt immer und immer wieder so, ich brauche Hilfe.

Methode:

@SuppressWarnings("resource") 
public static void writeFile(File file, String index) { 
    try { 
     boolean wri = false; 
     PrintWriter out = new PrintWriter(new FileWriter(file, true)); 
     Scanner scanner = new Scanner(file); 
     while(scanner.hasNext()) { 
      String str = scanner.nextLine(); 
      if(str.equals(index)) { 
       System.out.println(index); 
       scanner.close(); 
       wri = true; 
       break; 
      } else { 
       wri = false; 
       break; 
      } 
     } 

     if(wri != false) 
      return; 
     out.write(index); 
     out.write("\n"); 
     out.close(); 


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

Meinen Sie damit, dass es nicht die Datei überschrieben wird, sondern an jeden Anruf anhängen?Wenn dies der Fall ist, liegt das daran, dass in dem "FileWriter", der das Anhängen anzeigt, "true" übergeben wird. Aber ich bin mir nicht sicher, ob ich die Frage richtig verstanden habe. – KevinO

+0

Wie durch einen Kommentar impliziert, verwenden Sie die gleiche 'Datei', um (im 'PrintWriter') zu schreiben, während Sie von (im' Scanner') lesen. Ist das das beabsichtigte Verhalten? – KevinO

+0

@KevinO Ja, ich möchte überprüfen, ob es zuerst geschrieben wird, wenn es nicht ist, dann schreibe in die Datei, sonst schreibe nicht. – BeastlyMC956

Antwort

2

Sie Code voller Fehler ist.

  • Sie hasNext() nicht mit nextLine() verwenden. Verwenden Sie stattdessen hasNextLine().

  • Schließen Sie nicht scanner, wenn index nicht gefunden wird.

  • Sie können out nicht schließen, wenn index gefunden wird.

  • Sie öffnen Datei zum Schreiben, auch wenn Sie nichts schreiben müssen.

  • Sie ignorieren Ausnahmen.

  • if(wri != false) ist eine sehr obskure Art, if (wri) zu schreiben.

  • Keine Notwendigkeit, FileWriter in einem PrintWriter zu wickeln, wenn Sie nur write() Methode verwenden.

Da Sie ausdrücklich FileWriter constructor in append Modus nennen, würde ich annehmen, dass Sie index einzureichen, wenn und nur wenn die Datei nicht bereits diesen Text schreiben wollen, enthält.

Bitte beachten Sie, dass Ihre Logik wird nicht funktionieren, wenn index Zeilenumbruch Zeichen enthält.

Da Sie nur gerade lesen Linien, sollten Sie BufferedReader statt Scanner, verwenden, da Scanner einen sehr großen Overhead hat.

Was Ihre mangelnde Ressourcen schließen zu können, verwenden try-with-resources.

Ihr Code wie folgt sein sollte:

public static void writeFile(File file, String index) { 
    if (file.exists()) { 
     try (BufferedReader in = new BufferedReader(new FileReader(file))) { 
      for (String line; (line = in.readLine()) != null;) 
       if (line.equals(index)) 
        return; 
     } catch (Exception e) { 
      throw new RuntimeException("Error reading file: " + file, e); 
     } 
    } 
    try (FileWriter out = new FileWriter(file, true)) { 
     out.write(index); 
     out.write(System.lineSeparator()); 
    } catch (Exception e) { 
     throw new RuntimeException("Error appending to file: " + file, e); 
    } 
} 

-Test

File file = new File("C:/temp/test.txt"); 
writeFile(file, "Hello"); 
writeFile(file, "World"); 
writeFile(file, "Hello"); 

Datei-Inhalt

Hello 
World 
+0

Funktioniert perfekt! – BeastlyMC956

-1

Versuch mit falsch

PrintWriter out = new PrintWriter(new FileWriter(file, false)); 
+0

Wenn Sie das tun, wird die Datei vor der 'Scanner'-Schleife gelöscht, was wäre der Punkt dieser Schleife? – Andreas

+0

Das schreibt nur das letzte, was ich gesagt habe, es zu schreiben. – BeastlyMC956

+0

In der Tat hat keine Bedeutung, ich denke, er hat die Datei mit etwas geschrieben vorher, um es zu verarbeiten, trotzdem zeigt meine Antwort, wie man während des Schreibens an eine Datei anhängen kann. – Frank