¿Es necesario cerrar InputStreamReader incluso si InputStream debe permanecer abierta?

entreprenr:

El InputStreamse pasa como un parámetro de alguna parte, donde se procesa adicionalmente y luego se cierra. Así que no quiero cerrar la InputStreamaquí. Considere el siguiente código:

void readInputStream(final InputStream inputStream) {
    final BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
    String line;
    while ((line = bufferedReader.readLine() != null) {
        // do my thing
    }
}

Si cierro el BufferedReadery / o la InputStreamReader, a continuación, el subyacente InputStreamse cerrará, así, de acuerdo con otro post Stackoverflow.

Mi pregunta: ¿Los lectores deben ser cerradas, incluso si el subyacente InputStreamestá cerrada en otro lugar? ¿Puedo obtener una pérdida de memoria al no cerrar los lectores?

Stephen C:

Hacen los lectores deben ser cerradas, incluso si el subyacente InputStreamestá cerrada en otro lugar?

No hay absolutamente no necesitan estar en ese escenario. Pero en general es una buena idea para cerrar todos modos.

¿Puedo obtener una pérdida de memoria al no cerrar los lectores?

No, no hay pérdida de memoria, en el supuesto de que el Readermismo se convierte en inalcanzable una vez que haya terminado con él. Y, además, un Readerno suelen utilizar una gran cantidad de memoria.

La pregunta más importante es si se puede obtener un recurso de fugas al no cerrar una Reader. La respuesta es, depende.

  • Si usted puede garantizar que el subyacente InputStreamserá siempre cerrada en otro lugar en la aplicación, a continuación, que se encarga de posibles pérdidas de memoria.

  • Si no se puede garantizar que, a continuación, existe el riesgo de una pérdida de recursos. Los descriptores de fichero nivel de sistema operativo subyacentes son un recurso limitado en (por ejemplo) de Linux. Si una JVM no se cierra ellos, pueden agotarse y un ciertas llamadas al sistema comenzarán a fallar de forma inesperada.

Pero si lo hace cerca de la Readercontinuación del subyacente InputStream se puede cerrar.

Llamar close()más de una vez en una InputStreames inofensivo, y cuesta casi nada.

El único caso en el que no debe cerca de la Readeres cuando sería un error para cerrar el subyacente InputStream. Por ejemplo, si se cierra un SocketInputStreamresto de la solicitud no puede ser capaz de restablecer la conexión a la red. Asimismo, el InputStreamasociado con System.inpor lo general no puede ser vuelto a abrir.

En ese caso, en realidad es seguro permitir que el Readerque cree en su método de recolección de datos innecesarios. A diferencia InputStream, una típica Readerclase no anula Object::finalize()cerrar su fuente de datos.


@Pshemo llevado a un punto importante sobre el diseño del sistema.

Si acepta una InputStreamcomo argumento, entonces puede ser malo para envolverlo con un local Reader... sobre todo una BufferedReader. Una BufferedReaderes susceptible de lectura anticipada en la secuencia. Si la corriente va a ser utilizada por la persona que llama después de sus declaraciones de método, los datos que han sido leídos en el buffer, pero no consumidas por este método es posible que se pierdan.

Una mejor idea sería que la persona que llama para pasar una Reader. Alternativamente, este método debe ser documentado como tomar la propiedad de la InputStream. Y en ese caso, se debe siempre close()la misma.

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=119913&siteId=1
Recomendado
Clasificación