2009-06-16 7 views
5

J'utilise BufferedReader et PrintWriter pour parcourir chaque ligne d'un fichier d'entrée, modifier certaines lignes et afficher le résultat. Si une ligne ne subit pas de modification, elle est simplement imprimée telle quelle dans le fichier de sortie. Pour une raison quelconque, le processus se termine prématurément. Le code ressemble à ceci:Problèmes avec BufferedReader/PrintWriter?

BufferedReader in = new BufferedReader(new FileReader("in.txt")); 
FileOutputStream out = new FileOutputStream("out.txt"); 
PrintWriter p = new PrintWriter(out); 
String line = in.readLine(); 

while(line!=null) 
{ 
    if(line is special) 
     do edits and p.println(edited_line); 
    else 
     p.println(line); 

    line = in.readLine(); 
} 

Cependant, pour une raison étrange, ce processus se termine prématurément (imprime en fait une moitié d'une ligne) vers la fin de mon dossier d'entrée. Une raison évidente pour cela? La boucle while est clairement terminée par un null. Et c'est vers la fin de mon fichier txt 250k + ligne. Merci!

+0

Êtes-vous absolument certain qu'aucune exception ne sont jetés? Que feriez-vous si une exception * était * levée? Serait-il connecté? –

+0

Jon - n'oubliez pas que PrintWriter squeltches exceptions - vous devez utiliser la méthode "checkError" pour voir si un se produit. – MetroidFan2002

+0

Oui, mais BufferedReader et FileReader ne le font pas - donc l'appel à readLine() aurait pu être lancé. –

Répondre

7

Où rincer/fermer votre PrintWriter ou FileOutputStream? Si le programme se termine et que cela n'est pas fait, tous vos résultats ne seront pas écrits.

Vous avez besoin out.close() (peut-être un p.flush() aussi?) À la fin de votre processus pour fermer le flux de sortie de fichier

+1

Il vaut mieux fermer que simplement rincer. +1 –

+1

N'oubliez pas de le faire dans un bloc finally au cas où il y aurait une exception. –

+0

Cela devrait être p.close(). p.flush() * ne devrait pas être nécessaire mais il est bon de savoir que PrintWriter ne vide pas avant de fermer le flux sous-jacent. Si ce flux a un bug (-> ne se vide pas à la fermeture, non plus), vous aurez encore le même problème. –

1

Essayez d'ajouter un p.flush() après la boucle.

1

PrintWriter n'a pas d'autoflushing activé, il est donc probable que le dernier bit du fichier ne soit pas vidé avant la fin du programme. Ajout d'un p.flush() après votre boucle while devrait faire l'affaire.