Quand vider un BufferedWriter

Dans un programme Java (Java 1.5), j’ai un BufferedWriter qui enveloppe un Filewriter, et j’appelle write () plusieurs fois … Le fichier résultant est assez gros …

Parmi les lignes de ce fichier, certaines sont incomplètes …

Dois-je appeler flush chaque fois que j’écris quelque chose (mais je soupçonne que cela serait inefficace) ou utiliser une autre méthode de BufferedWriter ou utiliser une autre classe …?

(Comme j’ai un million de lignes à écrire, je veux quelque chose d’assez efficace.) Quel serait le moment idéal pour “chasser”? (quand j’atteins la capacité du BufferedWriter) …

Init:

try { analysisOutput = new BufferedWriter(new FileWriter( "analysisResults", true)); analysisOutput.newLine(); analysisOutput.write("Processing File " + fileName + "\n"); } catch (FileNotFoundException ex) { ex.printStackTrace(); } catch (IOException ex) { ex.printStackTrace(); } 

L’écriture:

 private void printAfterInfo(Ssortingng toBeMoved,HashMap afterMap, Location location) throws IOException { if(afterMap != null) { for (Map.Entry map : afterMap.entrySet()) { if (toBeMoved == "Condition") { if (1 <= DEBUG) System.out.println("###" + toBeMoved + " " + location + " " + conditionalDefs.get(conditionalDefs.size() - 1) + " After " + map.getKey() + " " + map.getValue() + "\n"); analysisOutput.write("###" + toBeMoved + " " + location + " " + conditionalDefs.get(conditionalDefs.size() - 1) + " After " + map.getKey() + " " + map.getValue() + "\n"); } else { if (1  0) analysisOutput.write("###" + toBeMoved + " " + location + " " + conditionalDefs.get(conditionalDefs.size() - 1) + " " + map.getKey() + " After " + map.getValue() + "\n"); else analysisOutput.write("###" + toBeMoved + " " + location + " " + map.getKey() + " After " + map.getValue() + "\n"); } } } 

Je viens de me rendre compte que les lignes incomplètes sont celles qui sont juste avant “Processing file” … alors cela se produit quand je passe d’un fichier que j’parsing à un autre …

Fermeture:

 dispatch(unit); try { if (analysisOutput != null) { printFileInfo(); analysisOutput.close(); } } catch (IOException ex) { ex.printStackTrace(); } 

Parfois, les informations imprimées par printFileInfo n’apparaissent pas dans le fichier de résultats …

Le BufferedWriter se BufferedWriter déjà lorsqu’il remplit son tampon. Dans les documents de BufferedWriter.write :

Normalement, cette méthode stocke les caractères du tableau donné dans la mémoire tampon de ce stream, vidant celle-ci du stream sous-jacent au besoin .

(Soulignez le mien.)

Le but de BufferedWriter est de consolider beaucoup de petites écritures en moins de grosses écritures, car cela est généralement plus efficace (mais plus difficile à coder). Vous ne devriez pas avoir besoin de faire quoi que ce soit de particulier pour le faire fonctionner correctement, sauf pour vous assurer de le vider lorsque vous en avez fini – et appeler close() fera de toute façon.

En d’autres termes, relaxez-vous simplement en écrivant, en écrivant, en écrivant et en fermant 🙂 Le seul moment où vous devez appeler manuellement est que si vous avez vraiment besoin des données sur le disque maintenant. (Par exemple, si vous avez un enregistreur perpétuel, vous pouvez le vider de temps en temps pour que quiconque lise les journaux n’ait pas besoin d’attendre que le tampon soit plein avant de pouvoir voir les nouvelles entrées du journal!)

Le moment idéal de vidage est lorsque vous avez besoin d’un autre programme pour lire le fichier afin de voir les données écrites avant la fermeture du fichier. Dans de nombreux cas, ce n’est jamais.