Il faut souligner que l'utilisation du code comme
BufferedInputStream br = new BufferedInputStream(new FileInputStream(file));
// you likely insert actual operations on br here
br.close();
est fortement déconseillée, car la fermeture ne se produira pas, si une opération entre la construction de cours d'eau et l'appel close()
lance une exception.
Vous devez utiliser le « essayer de ressource » construire à la place:
try(BufferedInputStream br = new BufferedInputStream(new FileInputStream(file))) {
// your actual operations on br here
}
Cela garantit que close()
sera appelée même si une exception se produit dans le corps try
. Cependant, ce code repose sur le fait connu que la méthode close()
de BufferedInputStream
appellera la méthode close()
de FileInputStream
, mais cela n'arrivera que lorsque la construction du BufferedInputStream
aura été complétée. Si le constructeur BufferedInputStream
lève une exception, sa méthode close()
ne sera pas appelée, car il n'y a aucun objet à appeler close()
.
Une solution vraiment sûre est
try(FileInputStream fis = new FileInputStream(file);
BufferedInputStream br = new BufferedInputStream(fis)) {
// your actual operations on br here
}
qui ferme la FileInputStream
même si le constructeur de BufferedInputStream
lance une exception. Cela pourrait ressembler à un cas de coin rare ici, car la seule chose qui peut mal tourner dans ce constructeur serait l'allocation de tampon qui pourrait lancer un OutOfMemoryError
et vous êtes dans le pétrin de toute façon dans ce cas.
Mais considérez un exemple comme
try(FileInputStream fis = new FileInputStream(file);
ObjectInputStream ois = new ObjectInputStream(fis)) {
// your actual operations on ois here
}
Depuis le constructeur de ObjectInputStream
lit déjà l'en-tête, IOException
s peuvent être jetés, aussi, l'en-tête peut être invalide, ce qui entraînerait aussi une exception. Par conséquent, il ya beaucoup plus qui peut mal tourner et s'assurer que le FileInputStream
sous-jacent est correctement fermé, même dans ces cas est beaucoup plus important.
Qu'entendez-vous par 'GB'? – biziclop
Vous ne devriez pas compter sur garbage collector pour faire la libération des ressources. La réponse correcte à votre question est "_it pourrait, ou pourrait ne pas". –
Pour approfondir le commentaire de @ M.Prokhorov: il n'y a aucune garantie quand le garbage collector fera son travail, en principe il peut retarder son travail indéfiniment, ce qui signifie que la ressource restera allouée indéfiniment, ce qui n'est pas ce que vous voulez. Fermez les ressources explicitement au lieu de vous fier au GC. – Jesper