Je lis un fichier local en utilisant un BufferedReader enroulé autour d'un FileReader:
BufferedReader reader = new BufferedReader(new FileReader(fileName));
// read the file
// (error handling snipped)
reader.close();
Ai-je besoin de close()
la FileReader
même ou sera la poignée wrapper qui? J'ai vu du code où les gens font quelque chose comme ça:
FileReader fReader = new FileReader(fileName);
BufferedReader bReader = new BufferedReader(fReader);
// read the file
// (error handling snipped)
bReader.close();
fReader.close();
Cette méthode est appelée à partir d'un servlet, et je voudrais m'assurer de ne laisser aucune poignée ouverte.
Réponses:
non.
ferme le flux selon javadoc pour BufferedReader et InputStreamReader
aussi bien que
Est-ce que.
la source
BufferedReader
lève une exception. Il est plus propre de fermer le flux sous-jacent, même si vous devez faire attention aux décorateurs avec d'autres ressources et tampons.BufferedReader.close()
ferme le lecteur sous-jacent. Sa description est simplement copiéeReader.close()
. Cela peut être le comportement réel dans la pratique, mais il n'est pas documenté.Reader#close()
les javadoc de ne disent pas si oui ou non il ferme le Reader encapsulé ou non. Tout ce qu'il dit lié à cela, c'estCloses the stream and releases any system resources associated with it.
ce qui n'est pas assez explicite pour dire qu'il ferme ou non la ressource. «Libérer la ressource» peut tout aussi bien supprimer toute référence à la ressource dans BufferedReader ... ce qui signifierait que la ressource n'est pas fermée.Comme d'autres l'ont souligné, il vous suffit de fermer l'emballage extérieur.
Il y a de très faibles chances que cela puisse faire fuir un descripteur de fichier si le
BufferedReader
constructeur lançait une exception (par exempleOutOfMemoryError
). Si votre application est dans cet état, le degré de précision de votre nettoyage peut dépendre du degré critique de ne pas priver le système d'exploitation des ressources qu'il souhaite allouer à d'autres programmes.L' interface Closeable peut être utilisée si un constructeur d'encapsuleur est susceptible d'échouer dans Java 5 ou 6:
Le code Java 7 doit utiliser le modèle try-with-resources :
la source
Selon la source de BufferedReader, dans ce cas, bReader.close appelle fReader.close pour que techniquement vous n'ayez pas à appeler ce dernier.
la source
Le code source de BufferedReader montre que le sous-jacent est fermé lorsque vous fermez BufferedReader.
la source
Reader#close()
, cela ne prouve pas concrètement que le JDK Oracle, par exemple, est implémenté dans un de façon similaire.Après avoir vérifié le code source, j'ai trouvé que pour l'exemple:
la méthode close () sur l' objet BufferedReader appellerait la méthode abstraite close () de la classe Reader qui appellerait finalement la méthode implémentée dans la classe InputStreamReader , qui ferme ensuite l' objet InputStream .
Donc, seul bReader.close () est suffisant.
la source
À partir de Java 7, vous pouvez utiliser l' instruction try-with-resources
Étant donné que l'
BufferedReader
instance est déclarée dans une instruction try-with-resource, elle sera fermée, que l'instruction try se termine normalement ou brusquement. Vous n'avez donc pas besoin de le fermer vous-même dans lafinally
déclaration. (C'est également le cas des instructions de ressources imbriquées)C'est la manière recommandée de travailler avec les ressources, voir la documentation pour plus d'informations
la source
Vous avez seulement besoin de fermer le bufferedReader ie reader.close () et cela fonctionnera très bien.
la source
Je suis en retard, mais:
BufferReader.java:
la source
Vous n'avez pas besoin de fermer le lecteur / graveur enveloppé.
Si vous avez jeté un œil à la documentation (
Reader.close()
,Writer.close()
), vous verrez queReader.close()
cela dit:Ce qui dit simplement qu'il "libère toutes les ressources système qui lui sont associées ". Même si cela ne confirme pas ... cela vous donne un coup de pouce pour commencer à chercher plus profondément. et si vous allez à
Writer.close()
il indique seulement qu'il se ferme.Dans de tels cas, nous nous référons à OpenJDK pour jeter un œil au code source.
À BufferedWriter Line 265, vous verrez
out.close()
. Donc ça ne se ferme pas… C'est autre chose. Si vous recherchez dans la classe des occurrences de "out
", vous remarquerez que dans le constructeur à la ligne 87 quiout
est l'écrivain, la classe s'enroule là où elle appelle un autre constructeur, puis attribue unout
paramètre à son propreout
variable.Alors ... Et les autres? Vous pouvez voir un code similaire sur BufferedReader Line 514 , BufferedInputStream Line 468 et InputStreamReader Line 199 . D'autres je ne sais pas mais cela devrait suffire à supposer qu'ils le font.
la source