Estoy leyendo un archivo local usando un BufferedReader envuelto alrededor de un FileReader:
BufferedReader reader = new BufferedReader(new FileReader(fileName));
// read the file
// (error handling snipped)
reader.close();
¿Necesito close()
el FileReader
también, o el envoltorio manejará eso? 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 se llama desde un servlet, y me gustaría asegurarme de no dejar ningún controlador abierto.
java
io
bufferedreader
filereader
Zilk
fuente
fuente
Respuestas:
No.
cierra la secuencia de acuerdo con javadoc para BufferedReader y InputStreamReader
tanto como
hace.
fuente
BufferedReader
arroje una excepción. Es más limpio solo para cerrar la secuencia subyacente, aunque debe tener cuidado con los decoradores con otros recursos y almacenamiento en búfer.BufferedReader.close()
cierra el lector subyacente. Su descripción simplemente se copia deReader.close()
. Este puede ser el comportamiento real en la práctica, pero no está documentado.Reader#close()
los javadoc no dicen si cierra o no está envuelto Reader. Todo lo que dice relacionado con eso esCloses the stream and releases any system resources associated with it.
que no es lo suficientemente explícito como para decir que cierra o no el recurso. 'Liberar el recurso' podría estar eliminando cualquier referencia al recurso en el BufferedReader ... lo que significaría que el recurso no está cerrado.Como otros han señalado, solo necesita cerrar el envoltorio exterior.
Hay una posibilidad muy pequeña de que esto pueda filtrar un identificador de archivo si el
BufferedReader
constructor arrojó una excepción (por ejemploOutOfMemoryError
). Si su aplicación se encuentra en este estado, el cuidado que debe tener su limpieza dependerá de lo importante que sea que no priva al sistema operativo de los recursos que podría asignar a otros programas.La interfaz Closeable se puede usar si un constructor de contenedor puede fallar en Java 5 o 6:
El código Java 7 debe usar el patrón de prueba con recursos :
fuente
Según la fuente de BufferedReader, en este caso bReader.close llame a fReader.close, por lo que técnicamente no tiene que llamar a este último.
fuente
El código fuente de BufferedReader muestra que el subyacente se cierra cuando cierra BufferedReader.
fuente
Reader#close()
, esto no proporciona evidencia concreta de que Oracle JDK, por ejemplo, esté implementado en un Moda similar.Después de verificar el código fuente, encontré eso para el ejemplo:
el método close () en el objeto BufferedReader llamaría al método abstracto close () de la clase Reader que finalmente llamaría al método implementado en la clase InputStreamReader , que luego cierra el objeto InputStream .
Entonces, solo bReader.close () es suficiente.
fuente
A partir de Java 7, puede usar la declaración de prueba con recursos
Debido a que la
BufferedReader
instancia se declara en una declaración de prueba con recursos, se cerrará independientemente de si la declaración de prueba se completa de manera normal o abrupta. Por lo tanto, no necesita cerrarlo usted mismo en lafinally
declaración. (Este también es el caso con las declaraciones de recursos anidados)Esta es la forma recomendada de trabajar con recursos. Consulte la documentación para obtener información más detallada.
fuente
Solo necesita cerrar el bufferedReader, es decir, reader.close () y funcionará bien.
fuente
Llego tarde, pero:
BufferReader.java:
fuente
Usted ¿No es necesario cerrar el lector / grabador envueltos.
Si ha echado un vistazo a los documentos (
Reader.close()
,Writer.close()
), verá que enReader.close()
él dice:Lo que simplemente dice que "libera todos los recursos del sistema asociados con él". A pesar de que no confirma ... te da un empujón para comenzar a mirar más profundo. y si vas
Writer.close()
solo dice que se cierra solo.En tales casos, nos referimos a OpenJDK para echar un vistazo al código fuente.
En BufferedWriter Line 265 verás
out.close()
. Entonces no se está cerrando a sí mismo ... Es algo más. Si busca en la clase las ocurrencias de "out
", notará que en el constructor de la línea 87, queout
es el escritor, la clase termina donde llama a otro constructor y luego asigna elout
parámetro a sí mismoout
variable.Entonces ... ¿Qué hay de los demás? Puede ver un código similar en BufferedReader Line 514 , BufferedInputStream Line 468 y InputStreamReader Line 199 . No conozco a otros, pero esto debería ser suficiente para suponer que sí.
fuente