(at least java 1.6 and earlier did had this problem).
JEDE Version von Java, und JEDE Sprache, hat dieses Problem; Es ist nicht spezifisch für Java.
Wenn Sie ein Eingabe- oder Ausgabehandle erhalten, das Systemressourcen benötigt, müssen Sie sie unabhängig von der Art freigeben.
Java hat Closeable
um anzuzeigen, dass die Instanz, die Sie halten können, oder kann nicht, halten Sie die Systemressourcen; aber wenn es passiert, wenn Sie nicht .close()
es tun, werden Sie Ressourcen verlieren; So einfach ist das.
Zum Beispiel haben Sie vielleicht eine Methode, die eine InputStream
als Argument hat; OK, gut, aber was ist das InputStream
? Ist es ein FileInputStream
oder ein ByteArrayInputStream
, oder noch etwas anderes? Du kannst es nicht wissen. Der erste muss ordnungsgemäß geschlossen werden, aber der zweite muss nicht.
Also was? .close()
sie alle sowieso, Sie haben nichts zu verlieren. Willst du wirklich das Risiko eingehen?
Mit Java 6, werden Sie Closer
Guava die verwendet werden sollen, da dies der sicherste Weg, um all Ihre Ressourcen zu haben, ist geschlossen (und das JDK bietet kein solches Werkzeug):
final Closer closer = Closer.create();
try {
final InputStream in = closer.register(openInHere());
final InputStream in2 = closer.register(...);
final OutputStream out = closer.register(...);
// do work with in, in2, out, other
} catch (WhateverException e) {
// IF WhateverException is not an IOException and you want to rethrow...
// throw closer.rethrow(e, WhateverException.class);
} finally {
closer.close(); // always safe
}
Mit Java 7, haben Sie versuchen-mit-Ressourcen, die mit allen AutoCloseable
Ressourcen arbeiten (die Closeable
erweitert):
try (
final InputStream in = ...;
// etc
) {
// work with AutoCloseable resources
} catch (WhateverException e) {
// deal with e, rethrow if necessary
}
der wesentliche Unterschied zwischen Closer
und versucht-with-Ressourcen ist, dass mit dieser, Ressourcen c sein losgelöst vorcatch
während Closer
wird sie in finally
geschlossen.
Aber wieder: keine Chance. Schließen Sie sie alle.
Beachten Sie, dass die Idee von 'close' normalerweise darin besteht, native Ressourcen freizugeben (wie C-Heap-allokierte Daten, die gelöscht werden müssen). Das doc für 'ByteArrayInputStream' [sagt ausdrücklich, dass 'close' keine Auswirkung hat] (http://docs.oracle.com/javase/7/docs/api/java/io/ByteArrayInputStream.html#close%28%29). Ich denke also nicht, dass es ein gutes Beispiel dafür ist, was Sie hier wirklich fragen. – Radiodef