sirve read que para new ejemplo clase java inputstream bufferedinputstream

read - inputstream api java



Cuando cierro un BufferedInputStream, ¿el InputStream subyacente también está cerrado? (5)

InputStream in = SomeClass.getInputStream(...); BufferedInputStream bis = new BufferedInputStream(in); try { // read data from bis } finally { bis.close(); in.close(); }

El javadoc para BufferedInputStream.close() no menciona si la secuencia subyacente está cerrada o no:

Cierra este flujo de entrada y libera los recursos del sistema asociados con el flujo. Una vez que se haya cerrado la transmisión, las invocaciones adicionales de read (), available (), reset () o skip () lanzarán una IOException. Cerrar una secuencia previamente cerrada no tiene efecto.

¿Es necesaria la llamada explícita a in.close() , o debería ser cerrada por la llamada a bis.close() ?


Aquí está la implementación de Java

/** * Closes this input stream and releases any system resources * associated with the stream. * Once the stream has been closed, further read(), available(), reset(), * or skip() invocations will throw an IOException. * Closing a previously closed stream has no effect. * * @exception IOException if an I/O error occurs. */ public void close() throws IOException { byte[] buffer; while ( (buffer = buf) != null) { if (bufUpdater.compareAndSet(this, buffer, null)) { InputStream input = in; in = null; if (input != null) input.close(); return; } // Else retry in case a new buf was CASed in fill() } }

Así, la corriente estará cerrada


BufferedInputStream dosent mantiene cualquier recurso del sistema por sí mismo, simplemente envuelve un InputStream que contiene esos recursos. Esto significa que el propio BufferedInputStream no tiene nada que cerrar, por lo que reenvía la operación de cierre al InputStream ajustado, que luego liberará sus recursos.


Cuando cierra un BufferedInputStream, el InputStream subyacente también se cierra. :)


Desde el código fuente de BufferedInputStream :

public void close() throws IOException { byte[] buffer; while ( (buffer = buf) != null) { if (bufUpdater.compareAndSet(this, buffer, null)) { InputStream input = in; in = null; if (input != null) input.close(); return; } // Else retry in case a new buf was CASed in fill() } }

Entonces la respuesta sería: SI


Sí. La secuencia subyacente se cerrará.