ich habe mal eine kurze Frage:
Wenn ich mehrere übereinandergestülpte (wie ist da eigentlich der Fachterminus??) Streams habe und fertig geschrieben oder gelesen habe, muss ich dann für jeden eine close() Methode aufrufen oder nur für einen. Und wenn ja welchen?
Also zu Beispiel
Java:
FileOutputStream fos =newFileOutputStream(f);ObjectOutputStream oos =newObjectOutputStream(fos);// ... do something ...// und jetzt wie schließen? 1, 2 oder 3/* 1 */ fos.close();/* 2 */ oos.close();/* 3 */ fos.close(); oos.close();// oder in anderer reihenfolge
Im Grund solltest Du alle Streams löschen,es sei denn Du weisst irgendwoher dass der Eine den Anderen bereits schliesst (Fachterminus meiner Meinung Wrapper-Klasse, weil ein Stream den anderen wrappt (umwickelt).
Daher sehe ich auch (im Sourcecode), dass der ObjectOutputStream in seiner close()-Methode den gewrappten Stream selber auch schliesst. Daher wäre es ausreichend nur diesen zu schliessen. Da man sich das aber kaum merken kann und nicht jedesmal in den Code schaut, ist es gute Praxis alle Streams selber zu schliessen.
Man sollte aber NICHT einfach close() aufrufen, sondern aufpassen dass eine Exception geworfen worden sein könnte und daher ein Stream noch auf null steht. Bei Dir könnte zum Beispiel new FileOutputStream(f); eine Exception werfen und oos bleibt null. Daher gäbe es dann eine NPE. Besser daher zu prüfen: if (oos != null) oos.close(). Derartige Aufräumarbeiten gehören daher in einen finally-Block einer try-Anweisung
Unter Java-7 gibt es auch dafür das Konstrukt try-with-resources wo die close()-Methoden automatisch aufgerufen werden.
also so mal spontan würd ich zwischen gewraptem und verschachteltem stream pendeln was allerdings übersetzt beides das selbe bedeutet und daher gleichwertig wäre
was das manuelle closen der einzelnen ebenen angeht
so lange man einen STANDARD-Stream der JavaSE API nutz so wird *abgesehen vom AutoCloseable* von jedem "höheren" stream der "darunter liegende" automatisch geclosed
man kann sich das mal mit nem JarOutputStream veranschaulichen
wenn man alles mal aus ein ander nehmen würde würde das so aussehen
womit es völlig ausreicht einmal JarOutputStream.close() aufzurufen da dieser aufruf einmal bis zum "niedrigsten" OutputStream durchgereicht wird
und das ist wie gesagt bei ALLEN JavaSE-Streams der fall *sowohl In- als auch OutputStreams*
problematisch wird es erst wenn man mit Streams von drittanbietern arbeitet
in aller regel sollte es dann aber in der DOC vermerkt sein wenn das close() nicht weitergereicht wird