Frage

Ich bin eine lokale Datei liest ein BufferedReader um einen Filereader eingewickelt mit:

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

Muss ich die close() auch, oder wird der Wrapper Griff FileReader das? Ich habe gesehen, Code, wo die Menschen 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 von einem Servlet aufgerufen wird, und ich möchte sicherstellen, ich lasse keine Griffe offen.

War es hilfreich?

Lösung

Nr.

BufferedReader.close()

schließt den Strom nach Javadoc- BufferedReader und Input

sowie

FileReader.close()

der Fall ist.

Andere Tipps

Wie andere haben darauf hingewiesen, brauchen Sie nur die äußere Hülle zu schließen.

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

Es gibt eine sehr geringe Chance, dass dies eine Datei-Handle auslaufen könnte, wenn der BufferedReader Konstruktor eine Ausnahme ausgelöst hat (z OutOfMemoryError). Wenn Ihre App in diesem Zustand sind, wie vorsichtig Ihre Sanierung Bedürfnisse sein könnte davon abhängen, wie wichtig es ist, dass Sie nicht das Betriebssystem von Ressourcen beraube sie in anderen Programmen zuweisen möchten.

Der Verschließbare Schnittstelle kann verwendet werden, wenn ein Wrapper-Konstruktor ist wahrscheinlich in Java 5 oder 6 zum scheitern verurteilt:

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

Java 7 Code sollte mit Try-with-Ressourcen Muster:

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

Nach BufferedReader Quelle, in diesem Fall bReader.close Aufruf fReader.close so technisch Sie müssen diese nicht nennen.

Der Quellcode für BufferedReader zeigt, dass die Basiswert ist geschlossen, wenn Sie die BufferedReader schließen.

Nach der Quellcode überprüft, fand ich, dass für das Beispiel:

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

die Methode close () auf BufferedReader Objekt nennen würde die abstrakte Methode close () von Reader Klasse, die letztlich die implementierte Methode nennen würde in Input Klasse, die dann schließt das Input Objekt.

Also, nur bReader.close () ausreichend.

Starten von Java 7 können Sie versuchen-with-Ressourcen Statement

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

Da die BufferedReader Instanz in einer Try-mit-Ressource-Anweisung deklariert wird, wird es unabhängig davon geschlossen werden, ob die try-Anweisung abgeschlossen ist normal oder abrupt. So dass Sie nicht selbst in der finally Anweisung brauchen um es zu schließen. (Dies ist auch der Fall mit verschachtelten Ressource-Anweisungen)

Dies ist die Art und Weise recomanded mit Ressourcen zu arbeiten, finden Sie in der Dokumentation für detailliertere Informationen

Sie müssen nur die BufferedReader d.h reader.close () zu schließen, und es wird gut funktionieren.

Ich bin spät, aber:

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;
        }
    }
}

Sie Do not Notwendigkeit, den eingewickelt Leser / Schreiber zu schließen.

Wenn Sie einen Blick auf die Dokumente genommen haben ( Reader.close() , Writer.close() ), werden Sie sehen, dass in Reader.close() heißt es:

  

Schließt den Stream und gibt alle Systemressourcen mit ihm verbunden ist.

Was sagt nur, dass es „gibt alle Systemressourcen assoziiert mit ihm“. Auch wenn es nicht bestätigt .. es gibt Ihnen einen Schub zu starten tiefer suchen. und wenn Sie gehen, um es Writer.close() nur besagt, dass es schließt sich.

In solchen Fällen verweisen wir auf OpenJDK einen Blick auf den Quellcode nehmen.

Bei BufferedWriter Line 265 out.close() sehen werden. So ist es nicht schließt sich .. Es ist etwas anderes. Wenn Sie die Klasse für Vorkommen von „out“ suchen werden Sie, dass im Konstruktor bemerken Linie 87 dieses out ist der Schreiber der Klasse Wraps, wo es andere Konstruktor aufruft und dann die Zuordnung out Parameter eine eigene out Variable ist. .

So .. Was andere? Sie können einen ähnlichen Code in BufferedReader Linie 514 , BufferedInputStream Linie 468 und Input Linie 199 . Andere ich weiß nicht, aber das sollte genug sein, anzunehmen, dass sie es tun.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top