2009-09-25 7 views
12

digo que algo como:Java: ¿Reader.close() cierra cualquier Lector encadenado?

Reader r = new BufferedReader(new FileReader(file)); 

... read ... 

r.close() 

¿Esta cerca de la FileReader subyacente (y liberar el identificador de archivo abierto)?

-Dave

+0

Por supuesto, si el constructor 'BufferedReader' lanza, no podrá cerrar el' FileReader' subyacente (que no puede especificar el juego de caracteres de todos modos, por lo que es un poco desesperado sí mismo). –

Respuesta

17

Sí, llamando close en el exterior más Reader va a ser suficiente

El artículo Java I/O Streams en el Sun Developer Network tiene una sección sobre Corriente del encadenamiento que dice lo siguiente:.

FileOutputStream fos = new FileOutputStream("myfile.out"); 
CryptOutputStream cos = new CryptOutputStream(fos); 
GZIPOutputStream gos = new GZIPOutputStream(cos); 

[...]

[...] cuando se cierra encadenados secuencias, solo tiene que cerrar la clase de secuencia más externa porque la llamada close() se filtra automáticamente a través de todas las clases encadenadas; en el ejemplo anterior, simplemente llamaría al método close() en la clase GZIPOutputStream.

Por lo tanto, en este caso, uno sólo tiene que llamar close en el BufferedReader.

Como dtsazza already mentioned, la Java API Specification para la clase BufferedReader dice que el método BufferedReader.close liberará los recursos subyacentes:

Cierra el flujo y libera los recursos del sistema asociados a ella. [...]

Entonces, uno puede inferir que cualquier Reader s subyacente, aunque no lo indique explícitamente.

+1

True (módulo [bugs] (http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6266377)) pero considere: http://stackoverflow.com/a/3629116/281545. Entonces, si 'CryptOutputStream' arrojó' IOException' en su ejemplo, ¿no debería la persona que llama cerrar 'fos' de todos modos? –

0

Sí. Lo hace. Descubrí esto cuando lo uso para enchufes.

My Question

Básicamente, usted simplemente no puede cerrarla hasta que haya terminado con el padre. En el caso de los zócalos, esto realmente cerrará su zócalo. :-(

4

De acuerdo con the documentation, simplemente "libera los recursos del sistema asociados con [el lector]". Si un lector cierra cualquier lector anidado es una cuestión de la implementación de la clase específica.

En el ejemplo específico que mencionó, sí, un BufferedReader siempre cerrará el lector anidado. Pero mientras esto ocurre generalmente, esto no significa necesariamente que todas las implementaciones de la interfaz Reader que tienen algún tipo de lector anidado propagarán una llamada close() a ellas - necesitaría verificar la documentación de ese específico clase para descubrir.

0

Sí, este es el patrón Decorador.

Cuestiones relacionadas