Ich bin heute auf diese Frage gestoßen und bin mir nicht sicher, ob sie geschlossen werden, da sie eingepackt ist oder ob es immer noch notwendig ist, alle Streams unabhängig voneinander zu schließen.Muss ich explizit alle Streams schließen, wenn sie über Java in einen Puffer eingebunden sind?
5
A
Antwort
8
Wenn irgendein Leser oder Stream einen anderen Leser/Stream schmückt, schließt das Schließen des äußeren auch den inneren. Dies kann aus der Javadoc von Closeable#close()
impliziert werden:
Schließt diesen Strom und gibt alle Systemressourcen mit ihm verbunden ist.
Das gilt auch für die zugrunde liegenden Ressourcen.
Wenn Sie sehr neugierig sind, können Sie in die Quellen dieser Klassen, z. in BufferedReader
:
public void close() throws IOException {
synchronized (lock) {
if (in == null)
return;
try {
in.close();
} finally {
in = null;
cb = null;
}
}
}
wo in
ist die zugrunde liegende Reader
.
5
Ja, dekorierte Bäche sind auch geschlossen.
InputStream in = new FileInputStream("c:\\myfile.txt");
InputStreamReader reader = new InputStreamReader(in);
BufferedReader bufferedReader = new BufferedReader(reader);
bufferedReader.close();
in.read(); // throws an IOException (no such file or directory)
reader.read(); // throws an IOException (Stream closed)
4
Von Java 7 Sie die Try-with-Ressourcenblock (und die Tatsache, dass die Schließung reader
die anderen schließt) verwenden können
try (BufferedReader reader = new BufferedReader(
new InputStreamReader(new FileInputStream(file), "UTF-8"))) {
// do I/O operations
} catch(IOException e) {
Log.d("IOException", "The Data Could Not Be Read =/", e);
}
Verwandte Themen
- 1. Streams, Puffer in Java
- 2. Muss ich bei proxool explizit jede getConnection() schließen?
- 3. Was muss ich schließen, wenn Printwriter in Java
- 4. Schließen Sie alle Puffer in Emacs aber bewahren neotree
- 5. Muss eine ConcurrentHashMap in einen synchronisierten Block eingebunden werden?
- 6. Schließen Sie alle Puffer neben dem aktuellen in Emacs
- 7. Explizit schließen FileInputStream
- 8. Warum muss ich einen generischen Anruf explizit umwandeln?
- 9. Warum sind GLM-Konstruktoren alle explizit?
- 10. vim: Suche ersetzen über alle beschreibbaren Puffer
- 11. Sind die Streams in Java 8 Monaden?
- 12. Kann ich eine Ctypes-CDLL explizit schließen?
- 13. java.nio Kanäle Puffer Streams Terminologie
- 14. Alle nicht geschlossenen Ressourcen in Java schließen
- 15. Schließen Eltern Akkordeon muss alle Kinder Akkordeon schließen
- 16. Können Sie alle JUnit-Tests in einem Paket über die Befehlszeile ausführen, ohne sie explizit aufzulisten?
- 17. Muss ich meine NSNumber explizit zuweisen?
- 18. Wenn eine PHP-PDO-Transaktion fehlschlägt, muss ich explizit rollback()?
- 19. Muss ich eine Mangustenverbindung manuell schließen?
- 20. Muss ich jeden EntityManager schließen()?
- 21. Wie kann ich einen Stream von Streams in Java abbilden?
- 22. Wie ziehe ich alle übereinstimmenden Zeilen in einen Puffer?
- 23. Verursachen nicht geschlossene Streams Speicherlecks in Java?
- 24. Muss ich alle Datenabruf-Listener explizit entfernen (value, child), wenn der Benutzer von Firebase abgemeldet wird?
- 25. Streams verwenden, um Boolean zurückzugeben, wenn alle List-Werte in einer Map leer sind/nicht leer
- 26. Deklarieren Sie explizit einen Variablentyp in Python
- 27. Muss ich den StreamReader in C# explizit schließen, wenn er eine Datei in eine String-Variable lädt?
- 28. Wie sind Javascript-Bibliotheken verfügbar, wenn sie in einen IIFE eingebunden sind? Ist der Ausführungskontext nicht entsorgt?
- 29. Schließen eines verschachtelten Streams schließt auch seine übergeordneten Streams?
- 30. Wann sollten Sie explizit einen StringBuilder verwenden?
Es ist nah alle Ströme im Zusammenhang ... aber es wouldn‘ t verletzt die anderen – 3kings
@ 3kings - Nun, ich würde argumentieren, dass redundanter Code tut weh. Besser, sich auf den Vertrag von 'close()' zu verlassen, als zusätzliche Aufrufe an jeden Leser/Stream hinzuzufügen, nur um es zu tun. –