2016-04-25 8 views
1

Ich weiß, dass ein InputStream geschlossen sein sollte. Aber ich habe Zweifel, wo und wie ich das mache.EingabeStream ohne einen try/catch-Block schließen?

Gemäß der Dokumentation auf IOUtils.closeQuietly:

Unconditionally einen Inputstream schließen. Entspricht InputStream.close(), außer Ausnahmen werden ignoriert. Dies ist typischerweise in Endblöcke.

Ich brauche keinen try/catch Block in meinem Code, so habe ich keinen finally Block. Ist es in Ordnung, den InputStream vor der Rückgabe in meiner Methode zu schließen, oder sollte ich etwas anderes tun? Diese Methode wird von mehreren Diensten verwendet, um eine InputStream aus einer Datei zu laden.

public InputStream read(String filename) { 
    InputStream inputStream = Thread.currentThread().getContextClassLoader().getResourceAsStream(filename); 

    if (inputStream == null) { 
     // Throw some exception 
    } 

    IOUtils.closeQuietly(inputStream); 

    return inputStream; 
} 
+0

bei Ihrer Methode der Suche Handhabung, es sollte nicht derjenige sein, der 'InputStream' zu schließen. Lassen Sie den Anrufer es angemessen schließen. – Tunaki

+0

Warum geben Sie den 'InputStream' zurück und nicht den Inhalt der Datei? – ndrone

+0

@ndrone Da gibt es andere Logik, die die Datei als 'InputStream' benötigt. Aber das ist für die Frage imo nicht relevant. – Diyarbakir

Antwort

7

Sie sollten nicht IOUtils.closeQuietly(inputStream); überhaupt in dieser Methode anrufen - es sehr wenig Sinn, einen geschlossenen Strom in der Rückkehr.

jedoch diese Methode sollte in einem try/finally-Block aufgerufen werden:

InputStream is = null; 
try { 
    is = read(filename); 
    // Do whatever with is. 
} finally { 
    IOUtils.closeQuietly(is); 
} 

oder mit Try-mit-Ressourcen (in Anbetracht der Kommentar here, dass „Try-mit-Ressourcen Aussage beseitigen die meisten muss für die Verwendung von IOUtils.closeQuietly „):

try (InputStream is = read(filename)) { 
    // Do whatever with is. 
} 
+0

Ich habe mehrere Dienste, die einen 'InputStream' aus einer Datei lesen müssen, die wiederum mit' ObjectMapper' auf ein 'Object' abgebildet werden muss. Ich möchte die Trennung von Bedenken (lesen von Datei, Karte zu Objekt) und ich möchte Logik wiederverwenden. Ich könnte eine abstrakte Elternklasse, statische Dienstprogrammklasse, was auch immer. Mein Punkt ist, dass meine Lese-Methode an keiner Stelle eine Ausnahme auslöst, so dass ich keinen Versuch/Fang brauche. Deshalb habe ich keinen endgültigen Block da drin. Sollte ich es nur noch mit einem Versuch/endlich umgeben? – Diyarbakir

+0

"Meine Lese-Methode wirft an keiner Stelle eine Ausnahme" Sicher, vielleicht, jetzt. Was ist, wenn Sie die Methode ändern? Es ist nur die beste Vorgehensweise, die Möglichkeit zu entfernen, einen Stream nicht zu schließen. –

+0

Danke für die nützlichen Tipps hier. Ich werde meinen Code umgestalten, um es besser zu machen. – Diyarbakir

0

try/finally-Block:

InputStream ist = null; versuchen { InputStream ist = ist = lesen (Dateiname); // Tu was auch immer ist. } schließlich { is.close(); }

Hinweis: alle I/O-Ressourcen in die endgültig geschlossen werden müssen, blockieren, da es in der try-catch-Block initialisiert wurde. Es ist auch hinzuzufügen geraten:

} catch(IOException e){ 
    e.printstacktrace(); 
} 

... für die Ausnahme

+0

Auch vergessen --- is.flush(); –

Verwandte Themen