variable validate example java inputstream

validate - Cierre de Java InputStreams



outputstream java (7)

Tengo algunas preguntas sobre el uso del método close () al usar Java InputStreams. Según lo que veo y leo de la mayoría de los desarrolladores, siempre debes llamar explícitamente a close () en un InputStream cuando ya no sea necesario. Pero, hoy estaba buscando utilizar un archivo de propiedades de Java, y cada ejemplo que he encontrado tiene algo como esto:

Properties props = new Properties(); try { props.load(new FileInputStream("message.properties")); //omitted. } catch (Exception ex) {}

Con el ejemplo anterior, no hay forma de llamar explícitamente a close () porque no se puede acceder al InputStream después de usarlo. He visto muchos usos similares de InputStreams a pesar de que parece contradecir lo que la mayoría de la gente dice sobre el cierre explícito. Leí los JavaDocs de Oracle y no menciona si el método Properties.load () cierra el InputStream. Me pregunto si esto es generalmente aceptable o si se prefiere hacer algo más como el siguiente:

Properties props = new Properties(); InputStream fis = new FileInputStream("message.properties"); try { props.load(fis); //omitted. } catch (Exception ex) { //omitted. } finally { try { fis.close(); } catch (IOException ioex) { //omitted. } }

¿Qué camino es mejor y / o más eficiente? ¿O de verdad importa?


La clase Propiedades envuelve la secuencia de entrada en un lector de línea para leer el archivo de propiedades. Como usted proporciona el flujo de entrada, es su responsabilidad cerrarlo.

El segundo ejemplo es una mejor manera de manejar la transmisión por lejos, no confíes en que alguien más la cierre por ti.

Una mejora que podría hacer es usar IOUtils.closeQuietly ()

http://commons.apache.org/io/api-1.2/org/apache/commons/io/IOUtils.html#closeQuietly(java.io.InputStream)

para cerrar la secuencia, por ejemplo:

Properties props = new Properties(); InputStream fis = new FileInputStream("message.properties"); try { props.load(fis); //omitted. } catch (Exception ex) { //omitted. } finally { IOUtils.closeQuietly(fis); }


Los ejemplos en el tutorial de propiedades cierran FileInputStream explícitamente después de la carga, por lo que creo que es seguro suponer que el método de load no es responsable de eso, usted sí.

// create and load default properties Properties defaultProps = new Properties(); FileInputStream in = new FileInputStream("defaultProperties"); defaultProps.load(in); in.close();

Solo como referencia, verifiqué la implementación de Properties de Apache Harmony , y no cierra la transmisión en la carga.


Me gustaría ir con un try-with-resources (al menos para Java 7+):

Properties props = new Properties(); try(InputStream fis = new FileInputStream("message.properties")) { props.load(fis); //omitted. } catch (Exception ex) { //omitted. }

La llamada close () se debe llamar automáticamente cuando se sale del bloque try.


No menciona en la documentación que props.load cerraría la secuencia de entrada. Debe cerrar la secuencia de entrada manualmente en un bloque finally como sugiere.

No es normal que una función cierre un InputStream . Se aplica la misma convención que con la memoria en lenguajes no recogidos de basura: si es posible, el que abre la secuencia debe cerrar la secuencia. De lo contrario, es muy fácil dejar una secuencia abierta (cree que una función va a cerrarla, pero no, o algo así ...)


Parece que la primera muestra de código termina confiando en el método de finalización en FileInputStream para cerrar realmente el archivo. Diría que su segundo ejemplo es mejor, aunque en ambos casos el archivo se cierra.

Hay casos como las secuencias de Byte donde close no hace nada y se pueden omitir, de lo contrario, creo que es mejor cerrar el archivo explícitamente en un bloque finally. Si lo abres, lo cierras.

Hay un libro en el sitio de Oracle llamado Java Platform Performance que analiza los finalizadores en su apéndice, dice:

Casi siempre es mejor que haga su propia limpieza en lugar de confiar en un finalizador. El uso de un finalizador también puede dejar recursos críticos que no se recuperarán durante un tiempo indeterminado. Si está considerando utilizar un finalizador para garantizar que los recursos importantes se liberen de manera oportuna, es posible que desee reconsiderarlo.


Permítanme agregar algo a las respuestas de otras personas.

Si puede importar Apache Commons IO , puede hacer uso de las siempre prácticas clases de AutoCloseInputStream : envuelve su InputStream y luego solo usa su instancia envuelta y se cierra automáticamente tan pronto como se llega al final de la entrada. o cuando la transmisión se cierra explícitamente, lo que ocurra primero.


Si está utilizando Java 7+, puede usar esto:

try(InputStream is = new FileInputStream("message.properties")) { // ... }