2012-07-11 12 views
7

He siguiente código:cómo cerrar la FileInputStream al leer el archivo de propiedades

// Read properties file. 
    Properties properties = new Properties(); 
    try { 
    properties.load(new FileInputStream("filename.properties")); 
    } catch (FileNotFoundException e) { 
    system.out.println("FileNotFound"); 
    }catch (IOException e) { 
    system.out.println("IOEXCeption"); 
    } 

es lo necesario para cerrar el FileInputStream? Si es así, ¿cómo hago eso? Recibo un error de mala práctica en mi lista de verificación de código. Pidiéndole que ponga finalmente el bloqueo.

Respuesta

8

Debe cerrar el FileInputStream, ya que la instancia Properties no lo hará. De Properties.load() javadoc:

La secuencia especificada permanece abierta después de que este método regrese.

tienda del FileInputStream en una variable independiente, declarado fuera de la try y añadir un bloque finally que cierra el FileInputStream si se abriese:

Properties properties = new Properties(); 
FileInputStream fis = null; 
try { 
    fis = new FileInputStream("filename.properties"); 
    properties.load(fis); 
} catch (FileNotFoundException e) { 
    system.out.println("FileNotFound"); 
} catch (IOException e) { 
    system.out.println("IOEXCeption"); 
} finally { 
    if (null != fis) 
    { 
     try 
     { 
      fis.close(); 
     } 
     catch (Exception e) 
     { 
      e.printStackTrace(); 
     } 
    } 
} 

Uso try-with-resources desde Java 7:

final Properties properties = new Properties(); 
try (final FileInputStream fis = 
     new FileInputStream("filename.properties")) 
{ 
    properties.load(fis); 
} catch (FileNotFoundException e) { 
    system.out.println("FileNotFound"); 
} catch (IOException e) { 
    system.out.println("IOEXCeption"); 
} 
2

Deberías estar siempre s cierre sus transmisiones, y hacerlo en el bloque finally es una buena práctica. La razón de esto es que el bloque finally siempre se ejecuta, y desea asegurarse de que la transmisión siempre esté cerrada, incluso si sucede algo malo.

FileInputStream inStream = null; 
    try { 
     inStream = new FileInputStream("filename.properties"); 
     properties.load(inStream); 
    } catch (FileNotFoundException e) { 
     System.out.println("FileNotFound"); 
    } catch (IOException e) { 
     System.out.println("IOEXCeption"); 
    } finally { 
     try { 
      inStream.close(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 

Si está utilizando Java 7, esto se convierte en mucho más fácil, ya que se introdujo una nueva sintaxis try-with. A continuación, puede escribir de esta manera:

try(FileInputStream inStream = new FileInputStream("filename.properties")){ 
     properties.load(inStream); 
    } catch (FileNotFoundException e) { 
     System.out.println("FileNotFound"); 
    } catch (IOException e) { 
     System.out.println("IOEXCeption"); 
} 

y la secuencia se cierra automáticamente.

1

aquí es un ejemplo:

public class PropertiesHelper { 
    public static Properties loadFromFile(String file) throws IOException { 
     Properties properties = new Properties(); 
     FileInputStream stream = new FileInputStream(file); 
     try { 
      properties.load(stream); 
     } finally { 
      stream.close(); 
     } 
     return properties; 
    } 
} 
+0

"Propiedades propiedades = nuevo" - incorrecto. – duffymo

1

Puede utilizar Lombok @Cleanup hacerlo simplemente. http://projectlombok.org/features/Cleanup.html

Properties properties = new Properties(); 
try { 
    @Cleanup FileInputStream myFis = new FileInputStream("filename.properties"); 
    properties.load(myFis); 
} catch (FileNotFoundException e) { 
    System.out.println("FileNotFound"); 
}catch (IOException e) { 
    System.out.println("IOEXCeption"); 
} 

O, sólo si su están utilizando Java 7, no es el "tratar con los recursos" nueva característica. http://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html

Properties properties = new Properties(); 
try (FileInputStream myFis = new FileInputStream("filename.properties")) { 
    properties.load(myFis); 
} catch (FileNotFoundException e) { 
    System.out.println("FileNotFound"); 
}catch (IOException e) { 
    System.out.println("IOEXCeption"); 
} 
Cuestiones relacionadas