2009-11-02 7 views
0

Dans le programme suivant, loop itère 1000 fois, et j'écris toutes les entrées dans un fichier en utilisant un FileWriter, mais malheureusement les programmes finissent par écrire seulement 510 (parfois 415, parfois 692, toujours moins de 1000) entrées dans le fichier, mais la boucle itère 1000 fois.Pourquoi toutes les entrées ne vont-elles pas dans le fichier?

import java.io.* ; 
import java.util.*; 

public class DemoWriter { 

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

     List<String> receiverList = new ArrayList<String>() ; 
     receiverList.add("[email protected]") ; 
     receiverList.add("[email protected]") ; 
     receiverList.add("[email protected]") ; 

     FileWriter fw = new FileWriter("a.txt") ; 
     BufferedWriter bw = new BufferedWriter(fw) ; 

     int size = receiverList.size() ; 

     String str ; 
     int count = 0 ; 
     for(int i = 1 ; i <= 1000 ; ++i){ 
      str = receiverList.get((int) (Math.random() * size)) + "\n" ; 
      bw.write(++count + ".> " + str) ; 
      System.out.print(count + ".> " + str) ; 
     } 
    } 
} 

Est-ce dû à la taille du fichier ou à quelque chose d'autre ???


Thnx pour la réponse rapide à toutes les personnes agréables ici. J'ai corrigé mon code (j'ai juste oublié de fermer le flux et maintenant le code fonctionne parfaitement). Comme tout a souligné que je dois fermer le flux, mais j'accepte BalusC comme il était le premier qui a répondu.

Nice à c BalusC ici. Cheers :)

Répondre

5

En effet, vous devez toujours fermer les ressources nécessaires pour vider tout et libérer les ressources. Le vidage explicite n'est pas nécessaire car il est généralement implicitement effectué pendant la fermeture. Il suffit d'appeler Closeable#close() à l'intérieur du enfin bloc d'un bloc try-catch-finally et tout va bien.

En savoir plus sur le Java IO tutorial.

+0

Vous ne voulez pas appeler close() dans la partie finally d'un bloc try-catch - il déclenche une exception. –

+2

Alors? Il suffit de l'attraper et d'ignorer davantage ou d'en faire un e.printStackTrace() à des fins de consignation. Il doit certainement être fait dans le bloc finally parce que vous feriez autrement des fuites de ressources. – BalusC

9

Vous ne fermez pas et ne rincez pas vos écrivains. Si vous appelez la méthode close() sur vos écrivains à la fin de votre code, les tampons seront vidés et les auteurs fermés. Comme Hank Gay le souligne dans les commentaires, les méthodes close() vont probablement lever une exception (un IOException, je crois). Cela signifie que vous devrez envelopper les appels pour fermer dans un bloc try/catch. Cependant, je vois votre main méthode lance Exception - ce n'est pas la meilleure pratique, mais il vous empêchera d'avoir besoin d'un bloc try/catch dans cette instance particulière.

+2

De même, le (s) appel (s) à 'close()' devrait se trouver dans un bloc 'finally'. –

0

Avez-vous besoin de fermer les objets BufferedWriter et FileWriter? Cela peut laisser des fichiers incomplets traîner.

+0

bw.close() devrait passer close() à travers. – Xailor

0

Il suffit d'ajouter

bw.flush(); 
    bw.close(); 

à la fin de la méthode

+2

Les noms de méthodes sont en minuscules et je crois (il faudrait vérifier les docs), mais appeler close ferme aussi le buffer ... –

+0

Je ne suis pas sûr de ça. C'est certainement le cas en C#. Les documents disent "public void close() throws IOException \\ Fermer le flux." – ALOR

+0

Ceci est Java, pas C#. Cela pourrait dépendre du type d'écrivain, cependant. –

Questions connexes