Pregunta ¿Tengo que cerrar explícitamente todas las transmisiones, si están envueltas en un búfer a través de Java?


private InputStream input;
private InputStreamReader inputReader;
private BufferedReader reader;

try {
    input = new InputStream();
    inputStreamReader = new InputStreamReader(inputStream);
    reader = new BufferedReader(inputStreamReader);
    // do I/O operations
} catch (IOException e) {
    Log.d("IOException", "The Data Could Not Be Read =/");
} finally {
    try {
        reader.close(); // now will this, by default, close all other streams? OR
      /*
       * input.close(); inputStream.close(); //is this necessary, along with
       * reader.close();
       */
    } catch (IOException ex) {
        ex.printStackTrace();
    }
}

Hoy me encontré con esta pregunta, y no estoy seguro de si se cerrarán, ya que está cerrada o si aún es necesario cerrar todas las transmisiones. independientemente.


5
2017-12-03 19:01


origen


Respuestas:


Si algún lector o flujo decora otro lector / flujo, entonces cerrar el externo también cierra el interno. Esto puede ser implícito desde el Javadoc de Closeable#close():

Cierra esta secuencia y libera alguna recursos del sistema asociados a ella.

Eso se aplica a los recursos subyacentes, también.

Si tienes mucha curiosidad, puedes profundizar en las fuentes de esas clases, por ejemplo. en BufferedReader:

public void close() throws IOException {
    synchronized (lock) {
        if (in == null)
            return;
        try {
            in.close();
        } finally {
            in = null;
            cb = null;
        }
    }
}

dónde in es el subyacente Reader.


8
2017-12-03 19:04



Sí, los arroyos decorados también están cerrados.

InputStream in = new FileInputStream("c:\\myfile.txt");
InputStreamReader reader = new InputStreamReader(in);
BufferedReader bufferedReader = new BufferedReader(reader);

bufferedReader.close();

in.read(); // throws an IOException (no such file or directory)
reader.read(); // throws an IOException (Stream closed)

5
2017-12-03 19:08



Desde Java 7 puede usar el bloque try-with-resource (y el hecho de que al cerrar reader cierra los demás)

try (BufferedReader reader = new BufferedReader(
                              new InputStreamReader(new FileInputStream(file), "UTF-8"))) {

    // do I/O operations
} catch(IOException e) {
    Log.d("IOException", "The Data Could Not Be Read =/", e);
} 

4
2017-12-03 19:16