web-dev-qa-db-fra.com

Dois-je fermer () FileReader et BufferedReader?

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 également besoin de close() la FileReader ou le wrapper le gèrera-t-il?

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'une servlet et j'aimerais m'assurer de ne laisser aucune poignée ouverte.

171
Zilk

non.

BufferedReader.close()

ferme le flux en fonction de javadoc pour BufferedReader et InputStreamReader

aussi bien que

FileReader.close()

est-ce que.

194
Atmocreations

Comme d'autres l'ont souligné, il vous suffit de fermer l'emballage extérieur.

BufferedReader reader = new BufferedReader(new FileReader(fileName));

Il y a très peu de chance que cela provoque la fuite d'un descripteur de fichier si le constructeur BufferedReader a émis une exception (par exemple, OutOfMemoryError). Si votre application se trouve dans cet état, la précision de votre nettoyage peut dépendre de la nécessité de ne pas priver le système d'exploitation de ressources qu'il peut souhaiter affecter à d'autres programmes.

L'interface Closeable peut être utilisée si un constructeur d'encapsulation est susceptible d'échouer sous Java 5 ou 6:

Reader reader = new FileReader(fileName);
Closeable resource = reader;
try {
  BufferedReader buffered = new BufferedReader(reader);
  resource = buffered;
  // TODO: input
} finally {
  resource.close();
}

Le code Java 7 doit utiliser le modèle try-with-resources:

try (Reader reader = new FileReader(fileName);
    BufferedReader buffered = new BufferedReader(reader)) {
  // TODO: input
}
90
McDowell

Selon la source BufferedReader, dans ce cas, bReader.close appelle alors fReader.close et techniquement, vous n'avez pas à appeler ce dernier.

6
Csaba_H

Le code source de BufferedReader indique que le sous-jacent est fermé lorsque vous fermez BufferedReader.

4
Brian Agnew

Après avoir vérifié le code source, j'ai trouvé que pour l'exemple:

FileReader fReader = new FileReader(fileName);
BufferedReader bReader = new BufferedReader(fReader);

la méthode close () sur BufferedReader object appellerait la méthode abstraite close () de Lecteur classe qui appellerait finalement la méthode implémentée dans InputStreamReader classe, qui ferme ensuite le Flux d'entrée objet.

Donc, seul bReader.close () est suffisant.

3
Anup Verma

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

Vous Don't devez fermer le lecteur/auteur enveloppé.

Si vous avez consulté la documentation ( Reader.close() , Writer.close() ), vous verrez que, dans Reader.close(), il est indiqué:

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

Ce qui dit simplement qu'il "libère toutes les ressources système associé avec elle". Même si cela ne confirme pas… cela vous donne un petit coup de pouce pour commencer à regarder plus en profondeur. et si vous allez à Writer.close(), il est uniquement indiqué qu'il se ferme.

Dans ce cas, nous nous référons à OpenJDK pour jeter un coup d’œil sur le 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 situé à Line 87 que out est l'écrivain, la classe renvoie où elle appelle un autre constructeur, puis affecte le paramètre out à sa propre variable out. .

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

0

Il vous suffit de fermer le fichier bufferedReader dans le fichier reader.close () pour que tout fonctionne correctement.

0
robust12

A partir de Java 7, vous pouvez utiliser l'instruction try-with-resources

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

Etant donné que l'instance BufferedReader est déclarée dans une instruction try-with-resource, elle sera fermée, que l'instruction try se termine normalement ou de manière abrupte. Vous n’avez donc pas besoin de le fermer vous-même dans la déclaration finally. (C'est également le cas des instructions de ressources imbriquées)

C’est le moyen recommandé de travailler avec des ressources. Voir documentation pour plus d’informations. 

0
Claudiu