2016-05-01 11 views
3

Unter Berücksichtigung von Java-Code unter:Schließt DataInputStream den umschlossenen InputSream, wenn der Müll erfasst wird?

void test(InputStream inputStream) { 
    DataInputStream dataInputStream = new DataInputStream(inputStream); 
    return; 
} 

wenn test Methode zurückgibt, wird Datainputstream (irgendwann) seinen Müll gesammelt. Schließt DataInputStream den inneren Stream in seinem Finalizer?

Ich konnte keine explizite Aussage finden, wenn es oder nicht tut. Gibt es eine offizielle Dokumentation über Verhalten? Kannst du bitte darauf hinweisen, wenn es einen gibt?

Danke.

Edit: Ich frage nicht, ob das Schließen von DataInputStream auch inneren Stream schließt. Ich frage was, wenn ich nicht schließe und der äußere Strom Müll ist, der gesammelt wird, während das Innere immer noch Referenzen darauf hat, also lebendig.

+2

@Tunaki das OP fragte, ob der Stream ohne eine explizite enge Verbindung wegen eines GC Finalizer geschlossen wird - und die Antwort ist nein, da es keinen Finalizer gibt – wero

+0

@wero Ja, das ist, was ich frage. Ist "Kein solcher Finalizer" an irgendeinem Ort dokumentiert? Ist es implementierungsspezifisch oder nach Spezifikation vorgeschrieben? Irgendwelche Links? Vielen Dank. – volkan

+3

@Volkan einfach auf die Quelle von 'DataInputStream' schauen und die Hierarchie aufarbeiten - es gibt keinen Finalizer. Die einzigen Klassen in 'java.io' mit einem Finalizer sind' FileInputStream' und 'FileOutputStream'. Ich weiß nicht, ob das irgendwo dokumentiert ist. – wero

Antwort

1

Es gibt keine Dokumentation sagen ausdrücklich, dass die DataInputStream keine Finalizerthread hat, aber man konnte füllen Bücher mit dem, was eine Klasse nicht tun. Da der Zweck einer finalize()-Methode darin besteht, eine Ressource freizugeben, hat ein fehlerhaftes Programm vergessen zu veröffentlichen, nur Klassen, die eine Ressource tragen, können ein solches Sicherheitsnetz haben. Aber DataInputStream hält keine Ressource, daher hat keine solche finalize() Methode.

Es ist die zugrunde liegende InputStream, die eine Ressource enthalten kann und daher, nur wenn der zugrunde liegende InputStream unerreichbar wird, kann ein bewahrender Reiniger die Ressource freigeben. Es kann sicherlich als gebrochenes Verhalten betrachtet werden, wenn Code außerhalb Ihrer Kontrolle Ihre fälschlicherweise schließt, während Sie immer noch einen starken Hinweis darauf halten.