Dans un programme Java (Java 1.5), j'ai un BufferedWriter qui enveloppe un FileWriter, et j'appelle write() beaucoup de fois ... Le fichier résultant est assez grand ...Quand rincer un BufferedWriter
Parmi les lignes de ce fichier, certaines d'entre elles sont incomplètes ...
Dois-je appeler flush à chaque fois que j'écris quelque chose (mais je suppose que ce serait inefficace) ou utiliser une autre méthode de BufferedWriter ou utiliser une autre classe ...?
(Puisque j'ai une ligne de zillion à écrire, je veux avoir quelque chose de très efficace.) Quel serait le moment idéal pour "flush"? (Quand je tends 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();
}
Rédaction:
private void printAfterInfo(String toBeMoved,HashMap<String, Boolean> afterMap, Location location)
throws IOException {
if(afterMap != null) {
for (Map.Entry<String, Boolean> 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 <= DEBUG)
System.out.println("###" + toBeMoved + " " + location + " "
+ map.getKey() + " After "
+ map.getValue() + "\n");
if (conditionalDefs.size() > 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 compris que les lignes qui sont incomplètes sont celles qui viennent avant "Processing file" ... donc cela se produit quand je passe d'un fichier que j'analyse à un autre ...
Clôture:
dispatch(unit);
try {
if (analysisOutput != null) {
printFileInfo();
analysisOutput.close();
}
}
catch (IOException ex) {
ex.printStackTrace();
}
Parfois, les informations imprimées par printFileInfo ne figure pas dans le fichier de résultats ...
sont incomplets, avez-vous plusieurs threads à écrire? IIRC un BufferedWriter n'est pas thread-safe, donc cela pourrait être une explication, mais il ne doit pas être "rincé manuellement" pour faire plus de place, il prend soin de lui-même. –
Si vous n'êtes pas sûr que votre question est claire, fournissez peut-être un échantillon de code ou un échantillon de sortie qui clarifie. –
Il est réellement thread-safe (bien que les décorateurs de Writer ont des problèmes d'accord sur quel objet verrouiller). –