Avez-vous pensé à fermer les flux de sortie? Votre exemple ne répertorie pas les appels à close(), qui doivent également vider les flux. Le comportement par défaut de BufferedWriter est de vider (écrire) son contenu restant avant de fermer le flux qu'il met en mémoire tampon.
Vous devriez probablement ajouter:
out1.close();
out2.close();
C'est un cas très courant lorsque la fin d'un fichier est coupé que vous avez oublié de fermer l'écrivain utilisé pour créer le fichier, en particulier lorsque vous avez utilisé un BufferedOutputStream ou BufferedWriter qui ne peut pas vider son tampon (écrire dans le fichier) jusqu'à ce qu'il ait été explicitement vidé (ou plus communément, fermé).
C'est une très bonne habitude d'écrire immédiatement l'appel close() après avoir ouvert le flux, puis d'écrire tout votre code pour travailler avec le flux entre les appels. La prise en compte des exceptions, les appels standard utilisent l'idiome suivant:
Writer myOutWriter = null;
try {
myOutWriter = new BufferedWriter(new FileWriter("..."));
// Write to myOutWriter here
} catch (IOException ioe) {
// Handle any exceptions here
} finally {
try {
if (myOutWriter != null) {
myOutWriter.close();
}
} catch (IOException ioe) {
// Not much you can do here
}
}
Le projet Apache Commons IO (http://commons.apache.org/io/) a une belle utilitaire appelé IOUtils.closeQuietly() qui nettoie le bloc finally en incluant la prise d'essai, null check, et appel à fermer en un appel de méthode. Un exemple en utilisant cette bibliothèque ressemblerait à ceci:
Writer myOutWriter = null;
try {
myOutWriter = new BufferedWriter(new FileWriter("..."));
// Write to myOutWriter here
} catch (IOException ioe) {
// Handle any exceptions here
} finally {
IOUtils.closeQuietly(myOutWriter);
}
Flushing seul ne suffit pas. Vous devez explicitement fermer les flux pour libérer des ressources. Le 'close()' videra déjà implicitement les tampons. – BalusC