10
votes

La fermeture d'un ruisseau imbriqué ferme également ses ruisseaux parents?

OutputStream fos;
OutputStream bos;
OutputStream zos;
try {
    fos = new FileOutputStream(anyFile);
    bos = new BufferedOutputStream(fos);
    zos = new ZipOutputStream(bos);
} finally {
    if (zos != null) {
        zos.close(); // + exception handling
    }
}
Does closing zos automatically closes bos and fos too, or do I need to close them manually?

1 commentaires

Vous devez également faire attention à Toujours Fermer le flux le plus à l'extérieur; Sinon, vous pouvez avoir une perte de données en raison de tampons non éclairés dans des flux d'enveloppe qui ont obtenu leur ruisseau emballé sous leur nez.


4 Réponses :


9
votes

Oui, ça fait. Son Javadoc dit:

ferme le flux de sortie zip ainsi que le flux filtré.

Aussi, le Javadoc pour BufferedOutPutStream dit:

ferme ce flux de sortie et libère les ressources système associées au flux.

Le Fermer méthode de FilterOutPutStream Appelle son Flush méthode, puis appelle la méthode Fermer de son sous-jacent flux de sortie.

Ainsi, lorsque vous fermez votre zipOutputStream , il fermera votre bufferedOutPutStream , qui fermera à son tour votre fichier FileOutPutStream . .


0 commentaires

4
votes

oui.

ZipOutputtream.close () La méthode est spécifiée par resserreable.close () qui:

ferme ce flux et libère les ressources système associées à ça.

La même chose s'applique à BufferedOutPutStream.close () , une méthode héritée de FilterOutPutStream .


0 commentaires

2
votes

fermeture du flux d'emballage ferme automatiquement le flux interne.

Donc, dans votre cas, vous n'avez besoin que de fermer zipOutputStream . La fermeture d'un flux ne jette pas à deux reprises une exception par conséquent, de la fermeture d'un courant interne (bien que inutile) fonctionne également (bien que inutile).

Voici ce qui se passe lorsque vous instaniez un zipOutputStream < Pré> xxx

voici la mise en oeuvre de zipOutputtream.close () xxx

similaire, bufferedOutPutStream ferme automatiquement le FileOutPutStream via son hérité filtreOutPutStream # Fermer () qui a été implémenté comme suit: xxx


0 commentaires

0
votes

oui ça fait. Mais étrangement, lorsque j'exécuterais le balayage de Fortify avec Rechercher Bug activé, il attire tous ces types de flux emballés et non récoltés en tant que fixes prioritaires. Je ne sais pas pourquoi ils le font


0 commentaires