2010-12-13 18 views
2

Hier ist das Code-Snippet.Warum schreibt bufferedwriter nicht in die Datei?

read = new FileReader("trainfiles/"+filenames[i]); 
       br = new BufferedReader(read); 
       while((lines = br.readLine())!=null){ 
        st = new StringTokenizer(lines); 
        while(st.hasMoreTokens()){ 
         bw = new BufferedWriter(new FileWriter("files/file.txt")); 
         bw.write(st.nextToken()); 
         bw.newLine(); 
        } 
       } 

Edit: Ich lese Dateien aus einem Verzeichnis. Also muss ich den Leser in jeder Schleife öffnen. Ich habe einige Änderungen vorgenommen, aber es schreibt auch nicht in diese Datei. Hier ist der Code:

for(i=0;i==0;i++){ 
      if(filenames[i].matches(".*ham.*")){ 
       System.out.println("ham:"+filenames[i]); 
       read = new FileReader("trainfiles/"+filenames[i]); 
       br = new BufferedReader(read); 
       while((lines = br.readLine())!=null){ 
        st = new StringTokenizer(lines); 
        while(st.hasMoreTokens()){ 
         System.out.println(st.nextToken()); 
         bw.write(st.nextToken()); 
        } 
       } 
       bw.close(); 
       br.close(); 

      }else{ 
       System.out.println("spam:"+filenames[i]); 
      } 
         } 

edit: ich den Code geändert, aber kein Erfolg,

while((lines = br.readLine())!=null){ 
        st = new StringTokenizer(lines); 
        bw = new BufferedWriter(new FileWriter("files/file.txt")); 
        while(st.hasMoreTokens()){ 
         System.out.println(st.nextToken()); 
         bw.write(st.nextToken()); 
        } 
        bw.close(); 
       } 

       br.close(); 

Und ich bin immer diese Fehlermeldung: Exception in thread "main" java.util.NoSuchElementException at java.util.StringTokenizer.nextToken(StringTokenizer.java:332) at Test.main(Test.java:30)

edit: Danke Jungs. . Ich habe es herausgefunden. Eigentlich habe ich ein Verzeichnis in Eclipse erstellt und ich habe es nicht aktualisiert, um den Inhalt zu sehen. Sein dumm ... anyways.thanks eine Menge

+1

Gibt es eine Fehlermeldung? Wird eine Datei erstellt? Rufst du nah() an? – jzd

+0

Warum instanziieren Sie einen neuen BufferedWriter für jeden von Ihnen ausgeführten Schreibvorgang? Außerdem solltest du immer alle offenen Streams schließen (nachdem die Arbeit erledigt ist, ofc :-)). – helpermethod

+0

Nach Ihrer letzten Bearbeitung erstellen Sie immer noch den BufferedWritter in der Schleife. Dies wird Ihre Datei schneiden – Tiago

Antwort

10
  • Sie schaffen die FileWritter innerhalb der Schleife, so dass Sie immer die Datei in jedem Zyklus gestutzt.
  • Aber mit ein wenig Glück (Beendigung des Programms kann der Writer zu flush) die Datei würde das letzte Wort Ihrer Eingabedatei enthalten, die ich nur vermuten könnte, wäre eine neue Zeile und Sie haben wahrscheinlich übersehen, als Sie die Datei öffneten, um den Inhalt zu überprüfen.

Ihre innere Schleife sollte wie folgt sein:

try (BufferedWriter bw = new BufferedWriter(new FileWriter("file.txt"))) { 
    while (st.hasMoreTokens()) { 
     bw.write(st.nextToken()); 
     bw.newLine(); 
    } 
} 
+0

Der Code ist nicht vollständig, zum Beispiel habe ich nicht den Tokenizer deklariert, der die Ausnahme verursacht. Es ist nur ein Beispiel, um Sie zu führen :) – Tiago

+0

bw.close() ist sehr wichtig. Danke für den Vorschlag. – Keyul

+1

'bw.close()' wird nicht im Falle von 'IOException' im Code-Snippet aufgerufen, das Sie angegeben haben. Bitte denken Sie daran, in Ihrer Antwort das 'try-with-resources'-Konstrukt zu verwenden. –

14

Ein paar Dinge:

  1. Sie einen neuen Filewriter jedes Mal durch die Schleife zu schaffen, die die Datei jedes Mal gestutzt werden.
  2. BufferedWriter ist gepuffert, und Sie werden nie den Puffer leeren. Sie müssen entweder bw.flush() aufrufen oder, noch besser, den Writer schließen, wenn Sie fertig sind.
+0

Besser, spülen Sie den Dekorateur in den glücklichen Fall. Schließen Sie die zugrunde liegende Ressource in "finally". (ObFileWriterComment: 'FileWriter' nimmt die Zeichenkodierung auf, die zu der Zeit der" Standard "ist. Viel besser, explizit eine Kodierung zu wählen, was' FileWriter' meidet) (Verwendung 'OutputStreamWriter').) –

+0

Closing liefert eine implizite Flush, also in den meisten einfachen Code ist das Schließen in einem endlich ausreichend. – Darron

0

Idealerweise sollten Sie folgenden Constructor verwenden FileWriter zu erstellen,

bw = new BufferedWriter(new FileWriter("files/file.txt",true)); 

Zweiter Parameter, true ist es, die neuen Daten zum Anhang. FileWriter wird Ihren vorherigen Schreibvorgang nicht abschneiden.

und Ihr Leser wird in der Lage sein, korrekte Daten zu lesen.

Verwandte Themen