Stream close() best practise?

  • 4 Antworten
  • Letztes Antwortdatum
missspelled

missspelled

App-Anbieter (In-App)
127
Hallo,
ich frage mich wie man am cleversten einen Stream schließt.
Gerade bei der Verwendung des "finally"-Blocks stehe ich gerade vor ein paar Fragezeichen.

"Ideal" wäre wahrscheinlich dieser Code:
Code:
public static void write(File output, byte[] bytes) {
try {
FileOutputStream fos = null;
try {
fos = new FileOutputStream(output.getAbsolutePath());
fos.write(bytes);
} catch (IOException e) {
e.printStackTrace();
} finally {
if (fos != null) {
fos.close();
}
}
} catch (IOException e) {
Log.e(TAG, "write Error: " + e);
}
}

Allerdings empfinde ich es als etwas unschön für close() einen weiteren catch zu nutzen.

Java io ugly try-finally block <- diese Vorgehensweise wird bei mir aktuell unter Java 1.6 nicht erkannt.

Danke vorab!
Martin
 
@Jaiel Ich benutze es nicht, hatte im Kopf, dass es dort ein Problem gibt. Deshalb habe ich noch mal nachgeschaut.

Laut Google geht das erst ab Level 19 (Android 4.4). Der Rest von Java 7 funktioniert ab Level 8. ADT Plugin Release Notes | Android Developers (ADT 22.6.0)

Würde mich aber nicht wundern, wenn es doch funktioniert. Aber wie gesagt, es fehlen mir Erfahrungswerte.
 
  • Danke
Reaktionen: missspelled
ich benutze immernoch den zusätzlichen Try Catch im Finally. Die meisten Java Entwickler sind es gewohnt und empfinden es nicht als unclean, weil der finally block genau dafür gedacht ist aufzuräumen. Im Stackoverflow Post, den du verlinkt hast fand sich auch diese (wie ich finde) recht schöne Lösung mit einer static Methode
Code:
public static void close(Closeable c) {
     if (c == null) return;
     try {
         c.close();
     } catch (IOException e) {
         //log the exception
     }
  }
Vielleicht kann man die Methode in eine Util Klasse auslagern und dann überall im Programm verwenden. Aber wie gesagt, die meisten Java Entwickler haben sich an den etwas komischen Anblick im Finally Block gewöhnt und stören sich nicht weiter daran.
 
  • Danke
Reaktionen: missspelled
Danke euch allen.
Irgendwie wird das bei mir nicht erkannt (IDE meldet "try is expected"... <- und das obwohl das "einleitende" try vorhanden ist und auch auf Java7 kompiliert wird).. werde es dann mit dem regulären zusätzlichen finally-Block machen.

Beste Grüße
Martin
 
Zurück
Oben Unten