207 votes

Dois-je fermer() à la fois le FileReader et le BufferedReader ?

Je lis un fichier local à l'aide d'un BufferedReader enveloppé dans un FileReader :

BufferedReader reader = new BufferedReader(new FileReader(fileName));
// read the file
// (error handling snipped)
reader.close();

Dois-je close() le site FileReader ou le wrapper s'en chargera-t-il ? 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 depuis une servlet, et je voudrais m'assurer que je ne laisse pas de handles ouverts.

4 votes

Tu sais, tu peux juste lire la source pour ce genre d'info. Tout est là, dans src.zip, dans le répertoire d'installation du JDK, ou vous pouvez le lire en ligne, par exemple à l'adresse suivante docjar.com/html/api/java/io/BufferedReader.java.html

57 votes

Dire à quelqu'un de lire la source est pire que de lui dire "RTFM !". Et que se passe-t-il si la source a un bug ; implicitement, nous voulons savoir ce que le correct comportement est ?

1 votes

Eh bien ... de ce point de vue : pointer vers les spécifications de l'API n'est pas mieux alors. Si la source n'a pas un bogue qui fait qu'elle ne se comporte pas comme il est spécifié dans les docs, vous ne pouvez pas vous fier aux docs. Il n'y a donc pas de bonne façon de répondre à une telle question.

2voto

Claudiu Points 401

À partir de Java 7, vous pouvez utiliser Déclaration "try-with-resources

try (BufferedReader br = new BufferedReader(new FileReader(path))) {
    return br.readLine();
}

Parce que le BufferedReader 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 la fermer vous-même dans l'instruction finally déclaration. (C'est également le cas pour les déclarations de ressources imbriquées).

C'est la façon recommandée de travailler avec les ressources, voir la page d'accueil du site web de la Commission européenne. documentation pour des informations plus détaillées

0 votes

Cette réponse est presque identique à la réponse de @mcdowell de 2009, qui couvre également certains cas de figure pouvant se produire.

0voto

Jitendra Points 52

Il vous suffit de fermer le BufferedReader, c'est-à-dire reader.close(), pour que tout fonctionne correctement.

0voto

Dmitry Gashko Points 90

Je suis en retard, mais :

BufferReader.java :

public BufferedReader(Reader in) {
  this(in, defaultCharBufferSize);
}

(...)

public void close() throws IOException {
    synchronized (lock) {
        if (in == null)
            return;
        try {
            in.close();
        } finally {
            in = null;
            cb = null;
        }
    }
}

0 votes

Eeeeh qui ne répond pas à sa question ? Elle/il demande si c'est nécessaire pour fermer FileReader et BufferedReader pas un exemple de code.

0 votes

@TornaxO7 non, ce n'est pas un code d'exemple. J'ai juste écrit une partie du code source de Java. Donc, si vous cliquez sur une fonction de BufferedReader avec la touche ctrl/cmd (cela dépend de l'IDE), vous pouvez voir le code source de BufferedReader, et vous pouvez trouver ce fragment de code. Ainsi, comme vous pouvez le voir, BufferedReader ferme simplement FileReader par lui-même ('in' est FileReader dans ce cas, donc, lorsque vous appelez bufferReader.close(), il appelle in.close() à l'intérieur, exactement dans la méthode bufferReader.close).

0voto

Vous Ne fais pas ça. il faut fermer le lecteur/écrivain enveloppé.

Si vous avez jeté un coup d'œil à la documentation ( [Reader.close()](https://docs.oracle.com/javase/7/docs/api/java/io/Reader.html#close()) , [Writer.close()](https://docs.oracle.com/javase/7/docs/api/java/io/Writer.html#close()) ), vous verrez que dans Reader.close() il est dit :

Ferme le flux et libère toutes les ressources système qui lui sont associées.

qui dit juste qu'il "libère toutes les ressources du système". associé à avec elle". Même si cela ne confirme pas cela vous donne un coup de pouce pour commencer à regarder plus profondément. et si vous allez à Writer.close() il est seulement indiqué qu'il se ferme tout seul.

Dans ce cas, on parle de OpenJDK pour jeter un coup d'oeil au code source.

À BufferedWriter Ligne 265 vous verrez out.close() . Donc il ne se ferme pas tout seul C'est quelque chose d'autre. Si vous recherchez dans la classe les occurrences de " out "vous remarquerez que dans le constructeur, à l'adresse Ligne 87 que out est l'auteur que la classe enveloppe où il appelle un autre constructeur et ensuite assigne out à son propre paramètre out variable

Alors Et les autres ? Vous pouvez voir un code similaire à Ligne BufferedReader 514 , BufferedInputStream Ligne 468 et InputStreamReader Ligne 199 . Je ne connais pas les autres, mais cela devrait suffire pour supposer qu'ils le font.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X