El InputStream
se pasa como un parámetro de alguna parte, donde se procesa adicionalmente y luego se cierra. Así que no quiero cerrar la InputStream
aquí. 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 BufferedReader
y / o la InputStreamReader
, a continuación, el subyacente InputStream
se cerrará, así, de acuerdo con otro post Stackoverflow.
Mi pregunta: ¿Los lectores deben ser cerradas, incluso si el subyacente InputStream
está cerrada en otro lugar? ¿Puedo obtener una pérdida de memoria al no cerrar los lectores?
Hacen los lectores deben ser cerradas, incluso si el subyacente
InputStream
está 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 Reader
mismo se convierte en inalcanzable una vez que haya terminado con él. Y, además, un Reader
no 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
InputStream
será 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 Reader
continuación del subyacente InputStream
se puede cerrar.
Llamar close()
más de una vez en una InputStream
es inofensivo, y cuesta casi nada.
El único caso en el que no debe cerca de la Reader
es cuando sería un error para cerrar el subyacente InputStream
. Por ejemplo, si se cierra un SocketInputStream
resto de la solicitud no puede ser capaz de restablecer la conexión a la red. Asimismo, el InputStream
asociado con System.in
por lo general no puede ser vuelto a abrir.
En ese caso, en realidad es seguro permitir que el Reader
que cree en su método de recolección de datos innecesarios. A diferencia InputStream
, una típica Reader
clase no anula Object::finalize()
cerrar su fuente de datos.
@Pshemo llevado a un punto importante sobre el diseño del sistema.
Si acepta una InputStream
como argumento, entonces puede ser malo para envolverlo con un local Reader
... sobre todo una BufferedReader
. Una BufferedReader
es 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.