Pregunta

Estoy leyendo un archivo local utilizando un BufferedReader envuelto alrededor de un FileReader:

BufferedReader reader = new BufferedReader(new FileReader(fileName));
// read the file
// (error handling snipped)
reader.close();

¿Es necesario que el close() FileReader así, o lo hará el asa de contenedor que? He visto código donde la gente hace algo como esto:

FileReader fReader = new FileReader(fileName);
BufferedReader bReader = new BufferedReader(fReader);
// read the file
// (error handling snipped)
bReader.close();
fReader.close();

Este método es llamado desde un servlet, y me gustaría para asegurarse de que no dejo los identificadores abiertos.

¿Fue útil?

Solución

no.

BufferedReader.close()

cierra la corriente según Javadoc para BufferedReader y InputStreamReader

así como

FileReader.close()

lo hace.

Otros consejos

Como otros han señalado, sólo tiene que cerrar la envoltura exterior.

BufferedReader reader = new BufferedReader(new FileReader(fileName));

Hay muy pocas posibilidades de que esto podría filtrarse un identificador de archivo, si el constructor BufferedReader inició una excepción (por ejemplo OutOfMemoryError). Si su aplicación es en este estado, lo cuidadoso sus necesidades de la limpieza para ser podría depender de lo importante que es que no se priva el sistema operativo de los recursos que puede ser que desee asignar a otros programas.

El cerrable interfaz se puede utilizar Si un constructor envoltura es probable que falle en Java 5 o 6:

Reader reader = new FileReader(fileName);
Closeable resource = reader;
try {
  BufferedReader buffered = new BufferedReader(reader);
  resource = buffered;
  // TODO: input
} finally {
  resource.close();
}

código Java 7 debe utilizar el try-con-recursos patrón:

try (Reader reader = new FileReader(fileName);
    BufferedReader buffered = new BufferedReader(reader)) {
  // TODO: input
}

De acuerdo con la fuente BufferedReader, en este caso llamada bReader.close fReader.close por lo que técnicamente no tiene que llamar a este último.

El código fuente para BufferedReader muestra que la subyacente se cierra cuando se cierra el BufferedReader.

Después de comprobar el código fuente, he encontrado que para el ejemplo:

FileReader fReader = new FileReader(fileName);
BufferedReader bReader = new BufferedReader(fReader);

cierre () en BufferedReader objeto llamaría al método abstracto close () de Lector clase que en última instancia llamar al método implementado en InputStreamReader clase, que luego se cierra la InputStream objeto.

Por lo tanto, sólo se bReader.close () es suficiente.

A partir de Java 7 se puede utilizar sentencia try-con-recursos

try (BufferedReader br = new BufferedReader(new FileReader(path))) {
    return br.readLine();
}

Debido a la instancia BufferedReader es declarada mediante una sentencia try-con-recurso, éste se cerrará sin importar si la sentencia try finaliza con normalidad o abrupta. Por lo que no es necesario cerrar por sí mismo en el estado finally. (Este es también el caso con instrucciones de recursos anidados)

Esta es la manera de trabajar con recomanded recursos, consulte la documentación de para obtener información más detallada

Sólo tiene que cerrar el BufferedReader es decir reader.Close () y no tendrán ningún problema.

Se me hace tarde, pero:

BufferReader.java:

public BufferedReader(Reader in) {
  this(in, defaultCharBufferSize);
}

(...)

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

No necesidad de cerrar el lector / grabador envueltos.

Si usted ha tomado un vistazo a la documentación ( Reader.close() , Writer.close() ), verá que en Reader.close() que dice:

  

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

Lo cual dice que "libera los recursos del sistema asociados con él". A pesar de que no confirma .. le da un empujón para empezar a buscar más profundo. y si vas a Writer.close() sólo establece que se cierra en sí.

En este caso, nos referimos a OpenJDK a echar un vistazo al código fuente.

A BufferedWriter Línea 265 verá out.close(). Así que no es cerrarse .. Es otra cosa. Si usted busca la clase de ocurrencias de "out" se dará cuenta de que en el constructor de la dirección Línea 87 que out es el escritor las envolturas de clase donde se llama a otro constructor y luego asignar el parámetro out a su propia variable out. .

Así que .. ¿Qué pasa con los demás? Se puede ver un código similar al BufferedReader Línea 514 , BufferedInputStream Línea 468 y InputStreamReader Línea 199 . Otros no lo sé, pero esto debería ser suficiente para suponer que lo hacen.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top