2010-12-13 48 views
2

Voici l'extrait de code.pourquoi bufferedwriter n'écrit pas dans le fichier?

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: Je lis des fichiers d'un répertoire. Donc, j'ai besoin d'ouvrir le lecteur dans chaque boucle. J'ai apporté quelques modifications, mais aussi il n'écrit pas dans ce fichier. Voici le 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]); 
      } 
         } 

modifier: J'ai modifié le code, mais sans succès,

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

Et je reçois cette erreur: Exception in thread "main" java.util.NoSuchElementException at java.util.StringTokenizer.nextToken(StringTokenizer.java:332) at Test.main(Test.java:30)

modifier: Merci les gars. Je l'ai compris. En fait, j'ai créé un répertoire dans eclipse et je ne l'ai pas actualisé pour voir le contenu. Son idiot ... anyways.thanks beaucoup

+1

Y at-il un message d'erreur? Un fichier est-il créé? Appelez-vous close()? – jzd

+0

Pourquoi instanciez-vous un nouveau BufferedWriter pour chaque écriture? De plus, vous devriez toujours fermer tous les flux ouverts (après le travail, ofc :-)). – helpermethod

+0

Après votre dernière modification, vous créez toujours le BufferedWritter dans la boucle. Cela va tronquer votre fichier – Tiago

Répondre

10
  • Vous créez la FileWritter dans la boucle de sorte que vous aurez toujours tronquer le fichier dans chaque cycle.
  • Vous avez oublié de fermer/vider le script
  • Mais avec un peu de chance (l'arrêt du programme peut provoquer le vidage du programme) le fichier contiendrait le dernier mot de votre fichier d'entrée que je devinerais être une nouvelle ligne et vous avez probablement manqué lorsque vous avez ouvert le fichier pour vérifier le contenu.

Votre boucle intérieure doit être quelque chose comme ceci:

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

Le code n'est pas complet, par exemple je n'ai pas déclaré le Tokenizer qui ressemble à cause de l'exception. C'est juste un échantillon pour vous guider :) – Tiago

+0

bw.close() est très important. Merci pour la suggestion. – Keyul

+1

'bw.close()' ne sera pas appelé en cas de 'IOException' dans l'extrait de code que vous avez fourni. Pensez à utiliser la construction 'try-with-resources' dans votre réponse. –

14

Quelques choses:

  1. Vous créez une nouvelle FileWriter chaque fois à travers la boucle, ce qui tronque le fichier à chaque fois. BufferedWriter est mis en mémoire tampon et vous ne videz jamais le tampon. Vous devez appeler bw.flush(), ou mieux encore, fermer le script lorsque vous avez terminé.
+0

Mieux, rincez le décorateur dans le cas heureux. Fermez la ressource sous-jacente dans 'finally'. (ObFileWriterComment: 'FileWriter' reprend le codage de caractères qui se trouve être le" défaut "à ce moment-là.Mieux préférable de choisir explicitement un encodage, ce qui signifie éviter" FileWriter' (utiliser 'OutputStreamWriter').) –

+0

fermeture fournit un implicite flush, donc dans le plus simple code de fermeture dans un est finalement suffisant. – Darron

0

Idéalement, vous devriez utiliser Constructor suivant pour créer FileWriter,

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

second paramètre, true est pour annexant les nouvelles données. FileWriter ne tronquera pas votre écriture précédente.

et votre lecteur sera en mesure de lire les données appropriées.