necesito rodean fileInputStream.cerrar con un try/catch/finally bloque? ¿Cómo se hace?

Tengo el siguiente Clase Java que se hace una cosa, fuegos fuera de los valores de configuración.propiedades.

Cuando llega el momento de cerrar el fileInputStream, creo que he leído en la Wikipedia que es bueno tener en un bloque finally. Porque sinceramente funciona muy bien en bloque try/catch.

¿Me puedes mostrar la corrección para obtener fileInputStream.close() en un por último, la sección?

ConfigProperties.java
paquete de base;

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;
    }
}

Es la solución única para hacer como Eclipse sugiere y hacer esto en el bloque finally?

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

Gracias a todos!

FYI: commons-io tiene una buena función: IOUtils.closeQuietly() que se encargará de try/catch en el cierre. El código se verá mucho mejor 🙂 ten en cuenta que esta función no darle la oportunidad de responder a la IOException, pero normalmente la gente no hace eso y omitir la excepción de todos modos. Si usted necesita para responder, hacer su propio método de utilidad que los registros o imprime un seguimiento de la pila o lo que usted necesita hacer.

OriginalEl autor JoJo | 2012-07-24

3 Kommentare

  1. 7

    Porque FileInputStream.close() produce una IOException, y finalmente{} bloque no captura de excepciones. Así que tienes que coger o declarar con el fin de compilar. Eclipse sugerencia es buena; coger el IOException dentro de la finally{} bloque.

    También puede utilizar el IOUtils.closeQuietly() método de Commons IO. Ajusta el método close para soltar todo el IOExceptions que son lanzados. Limpiador de tener otro bloque try/catch.

    OriginalEl autor Jon Lin

  2. 14

    Sí, que es el común de la pre-Java 7 solución. Sin embargo, con la introducción de Java 7, ahora hay prueba-con-recursos declaraciones, en las que se cierre automáticamente cualquier declarado recursos cuando el try bloquear las salidas:

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

    OriginalEl autor Jeffrey

  3. 7

    El enfoque estándar es:

    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
        }
    }

    OriginalEl autor Bohemian

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea