2012-07-24 2 views
5

Ich habe die folgende Java-Klasse, die eine Sache tut, feuert Werte aus der config.properties.Muss ich fileInputStream.close mit einem try/catch/finally Block umgeben? Wie wird es gemacht?

Wenn es Zeit ist, die fileInputStream zu schließen, denke ich, dass ich auf Wikipedia gelesen habe, dass es gut ist, es in einem Endblock zu haben. Weil es ehrlich gesagt gut funktioniert in try/catch block.

Können Sie mir zeigen, korrigieren Sie fileInputStream.close() in einem abschließend Abschnitt?

ConfigProperties.java Gehäusebasis;

import java.io.FileInputStream; 
import java.util.Properties; 

public class ConfigProperties { 

    public FileInputStream fileInputStream; 
    public String property; 

    public String getConfigProperties(String strProperty) { 

     Properties configProperties = new Properties(); 
     try { 

      fileInputStream = new FileInputStream("resources/config.properties"); 
      configProperties.load(fileInputStream); 
      property = configProperties.getProperty(strProperty); 
      System.out.println("getConfigProperties(" + strProperty + ")"); 

      // use a finally block to close your Stream. 
      // If an exception occurs, do you want the application to shut down? 

     } catch (Exception ex) { 
      // TODO 
      System.out.println("Exception: " + ex); 
     } 
     finally { 
      fileInputStream.close(); 
     } 

     return property; 
    } 
} 

Ist die Lösung nur zu tun, wie Eclipse vorschlägt und dies im finally block tun?

finally { 
    try { 
     fileInputStream.close(); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
} 

Danke allen!

+1

FYI: commons-io hat eine nette Funktion: IOUtils.closeQuietly(), die sich um das try/catch beim Schließen kümmert. Ihr Code wird viel schöner aussehen :) Beachten Sie, dass diese Funktion Ihnen nicht die Möglichkeit gibt, auf die IOException zu reagieren, aber normalerweise tun die Leute das nicht und ignorieren die Ausnahme trotzdem. Wenn Sie reagieren müssen, erstellen Sie eine eigene Hilfsmethode, die einen Stack-Trace protokolliert oder druckt oder was auch immer Sie tun müssen. – Matt

Antwort

7

Weil FileInputStream.close() eine IOException auslöst und der finally {} Block keine Ausnahmen abfängt. Sie müssen es entweder abfangen oder deklarieren, um es zu kompilieren. Der Vorschlag von Eclipse ist in Ordnung; Fange die IOException innerhalb des finally {} Blocks.

+0

Sie können auch die [IOUtils.closeQuietly()] (http://commons.apache.org/proper/commons-io/javadocs/api-2.4/org/apache/commons/io/IOUtils.html#closeQuietly (java.io.Closeable)) Methode von Commons IO. Es schließt die close-Methode, um alle ausgelösten IOExceptions zu löschen. Sauberer als einen anderen Versuch/Catch-Block. –

11

Ja, das ist die übliche Pre-Java 7 Lösung. Doch mit der Einführung von Java 7 gibt es nun try-with-resource Aussagen, die automatisch alle deklarierten Ressourcen wird geschlossen, wenn die try Block beendet:

try (FileInputStream fileIn = ...) { 
    // do something 
} // fileIn is closed 
catch (IOException e) { 
    //handle exception 
} 
7

Der Standardansatz ist:

FileInputStream fileInputStream = null; 
try { 
    fileInputStream = new FileInputStream(...); 
    // do something with the inputstream 
} catch (IOException e) { 
    // handle an exception 
} finally { // finally blocks are guaranteed to be executed 
    // close() can throw an IOException too, so we got to wrap that too 
    try { 
     if (fileInputStream != null) { 
      fileInputStream.close(); 
     }   
    } catch (IOException e) { 
     // handle an exception, or often we just ignore it 
    } 
}