Schließen Sie einen Scanner verbunden mit System.in
Ich habe eine Scanner
verbunden System.in
. Jetzt, nachdem Sie mit den Scanner
sollte ich es schließen, da es schlecht Codierung der Praxis offen lassen. Aber, wenn ich in der Nähe der Scanner
werde ich auch schließen System.in
! Kann mir jemand sagen, wie ich die schließen kann, die Scanner
ohne schließen System.in
(wenn es irgendeinen Weg gibt).
- stackoverflow.com/questions/5919143/... ich hoffe, dies kann von nutzen sein für Sie. Ich bin immer noch auf der Suche, um zu sehen, wenn System.in implementiert verschließbar. Falls nicht, sollten Sie Sie im klaren bist.
- Beachten Sie, dass Sie guard, den stream mit a Dekorator.
- Yep, System.in macht umzusetzen verschließbar.
System.in
ist einInputStream
und daher implementiertAutoClosable
finden Sie unter docs.- scratch, dass, nicht in der Nähe du bist scanner. Ich poste die Antwort
- sorry für hijacking Ihre Antwort. Habe es nicht gesehen, bis ich hatte schon gepostet, das gleiche XD
- kein Problem
- mögliche Duplikate von Schließen BufferedReader und System.in
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ist eine option, um wickeln Sie Ihre
System.in
stream in einerCloseShieldInputStream
verhindert, dass es geschlossen wird. Ihre Leser würden dann verwenden Sie dieCloseShieldInputStream
eher als das roheSystem.in
stream.Hier ist die API für die Klasse:
http://commons.apache.org/io/apidocs/org/apache/commons/io/input/CloseShieldInputStream.html
Das einfachste ist, nicht schließen, Scanner, wenn Sie nicht möchten, schließen Sie den zugrunde liegenden stream.
Idealerweise sollten Sie nur einen Scanner, die Sie verwenden, für die Lebensdauer des Programms. In jedem Fall, es scheint, dass Sie nicht einen guten Grund haben, um es zu schließen.
CloseShieldInputStream
ermöglicht es dem code, diese Tatsache zu ignorieren und einfach behandeln wie jeden anderen InputStream und versuchen, ihn zu schließen, wenn Sie fertig sind. Was einfach ist hier wirklich abhängig vom Kontext.Anstatt Schild-Klassen und sowas, einfach einen netten Kommentar und eine
Das ist gut genug. Und ich weiß nicht scheinen, um zu sehen, eine Menge Nachteile dieses Ansatzes. Vergessen Sie nicht den Kommentar.
IOException: Stream closed
wenn man versucht, dieSystem.in
nach dem schließen der ScannerHabe ich vage Erinnerungen an seltsame, undiagnosable Probleme vor langer Zeit mit den gleichen
Scanner
vonSystem.in
zweimal, so dass dies ist, was ich verwenden (auch wenn Sie sollten wahrscheinlich nur einen scanner für die Dauer des Programms):Für einige Grund, warum das funktioniert, ohne Warnungen, in der Erwägung, dass, wenn ich nicht fangen-werfen, Eclipse beschweren
Resource leak: '<unassigned Closeable value>' is never closed
.Entsprechend der API für InputSteam "mit Der close-Methode des InputStream macht nichts.", so da sich das System.in eine Instanz von InputStream brauchen Sie nicht zu befürchten close() aufgerufen wird, auf Sie.
Scanner
aufSystem.in
wird, schließen Sie es, und öffnen Sie dann eine andere und dann versuchen, es zu verwenden (z.B.nextLine()
), bekomme ichNoSuchElementException
.close()
tatsächlich nichts in der default-Implementierung des abstraktenInputStream
heißt das nicht, das gilt für alle Ihre Unterklassen! Wenn das stimmte, wäre die Methode nutzlos.InputStream
ist eine abstrakte Klasse. Unterklassen können und sollten "etwas tun", wenn Sie repräsentieren eine Ressource (wie stdin) geschlossen werden muss, nach der Verwendung. Gewährt werden könnten klarer inInputStream.close()
, aber Ihre Schlussfolgerung ist falsch.