Ich lese eine lokale Datei mit einem BufferedReader, der um einen FileReader gewickelt ist:
BufferedReader reader = new BufferedReader(new FileReader(fileName));
// read the file
// (error handling snipped)
reader.close();
Muss ich close()
das FileReader
auch oder wird der Wrapper damit umgehen? Ich habe Code gesehen, in dem Leute so etwas tun:
FileReader fReader = new FileReader(fileName);
BufferedReader bReader = new BufferedReader(fReader);
// read the file
// (error handling snipped)
bReader.close();
fReader.close();
Diese Methode wird von einem Servlet aufgerufen, und ich möchte sicherstellen, dass keine Handles offen bleiben.
java
io
bufferedreader
filereader
Zilk
quelle
quelle
Antworten:
Nein.
Schließt den Stream gemäß Javadoc für BufferedReader und InputStreamReader
ebenso gut wie
tut.
quelle
BufferedReader
löst eine Ausnahme aus. Es ist sauberer, nur um den zugrunde liegenden Stream zu schließen, obwohl Sie auf Dekorateure mit anderen Ressourcen und Pufferung achten müssen.BufferedReader.close()
der zugrunde liegende Leser geschlossen wird. Die Beschreibung wird einfach von kopiertReader.close()
. Dies mag das tatsächliche Verhalten in der Praxis sein, ist jedoch nicht dokumentiert.Reader#close()
die Javadocs sagen nicht, ob sie den verpackten Reader schließen oder nicht. Alles, was damit in Verbindung stehtCloses the stream and releases any system resources associated with it.
, ist nicht explizit genug, um zu sagen, dass die Ressource geschlossen wird oder nicht. 'Ressource freigeben' kann genauso gut einen Verweis auf die Ressource im BufferedReader entfernen ... was bedeuten würde, dass die Ressource nicht geschlossen ist.Wie andere bereits betont haben, müssen Sie nur die äußere Hülle schließen.
Es besteht eine sehr geringe Wahrscheinlichkeit, dass dadurch ein Dateihandle verloren geht, wenn der
BufferedReader
Konstruktor eine Ausnahme auslöst (zOutOfMemoryError
. ). Wenn sich Ihre App in diesem Zustand befindet, hängt die Sorgfalt bei der Bereinigung möglicherweise davon ab, wie wichtig es ist, dass Sie dem Betriebssystem nicht die Ressourcen entziehen, die es möglicherweise anderen Programmen zuweisen möchte.Die Closeable- Schnittstelle kann verwendet werden, wenn ein Wrapper-Konstruktor in Java 5 oder 6 wahrscheinlich ausfällt:
Java 7-Code sollte das Muster " Try-with-Resources" verwenden :
quelle
Laut BufferedReader-Quelle ruft bReader.close in diesem Fall fReader.close auf, sodass Sie letzteres technisch nicht aufrufen müssen.
quelle
Der Quellcode für BufferedReader zeigt, dass der Basiswert geschlossen wird, wenn Sie den BufferedReader schließen.
quelle
Reader#close()
, liefert dies keinen konkreten Beweis dafür, dass das Oracle JDK beispielsweise in a implementiert ist ähnliche Mode.Nachdem ich den Quellcode überprüft hatte, stellte ich Folgendes fest:
Die close () -Methode für das BufferedReader- Objekt würde die abstrakte close () -Methode der Reader- Klasse aufrufen, die letztendlich die implementierte Methode in der InputStreamReader- Klasse aufruft , die dann das InputStream- Objekt schließt .
Es ist also nur bReader.close () ausreichend.
quelle
Ab Java 7 können Sie die Anweisung try-with-resources verwenden
Da die
BufferedReader
Instanz in einer Try-with-Resource-Anweisung deklariert ist, wird sie geschlossen, unabhängig davon, ob die try-Anweisung normal oder abrupt ausgeführt wird. Sie müssen es also nicht selbst in derfinally
Anweisung schließen. (Dies ist auch bei verschachtelten Ressourcenanweisungen der Fall.)Dies ist die empfohlene Methode zum Arbeiten mit Ressourcen. Weitere Informationen finden Sie in der Dokumentation
quelle
Sie müssen nur den bufferedReader, dh reader.close (), schließen, und es funktioniert einwandfrei.
quelle
Ich bin spät dran, aber:
BufferReader.java:
quelle
Sie nicht den verpackten Leser / Schreiber schließen müssen.
Wenn Sie sich die Dokumente (
Reader.close()
,Writer.close()
) angesehen haben, sehen Sie, dassReader.close()
darin steht:Welche sagt nur , dass es „keine Systemressourcen freigibt assoziiert mit ihm“. Auch wenn es nicht bestätigt wird, gibt es Ihnen einen Anstoß, tiefer zu schauen. und wenn Sie dorthin gehen, heißt
Writer.close()
es nur, dass es sich selbst schließt.In solchen Fällen verweisen wir auf OpenJDK , um einen Blick auf den Quellcode zu werfen.
Bei BufferedWriter Line 265 sehen Sie
out.close()
. Es schließt sich also nicht von selbst. Es ist etwas anderes. Wenn Sie die Klasse nach Vorkommen von "out
" durchsuchen, werden Sie feststellen, dass im Konstruktor in Zeile 87 ,out
der der Writer ist, die Klasse umschließt, wo sie einen anderen Konstruktor aufruft und dannout
ihrer eigenenout
Variablen Parameter zuweist .Also .. Was ist mit anderen? Sie können ähnlichen Code in BufferedReader Line 514 , BufferedInputStream Line 468 und InputStreamReader Line 199 sehen . Andere kenne ich nicht, aber das sollte ausreichen, um anzunehmen, dass sie es tun.
quelle