¿Debo cerrar () tanto FileReader como BufferedReader?

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(); 

¿Debo close() el FileReader también, o lo manejará el contenedor? 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(); 

Se llama a este método desde un servlet, y me gustaría asegurarme de no dejar ningún controlador abierto.

no.

 BufferedReader.close() 

cierra la secuencia según javadoc para BufferedReader y InputStreamReader

tanto como

 FileReader.close() 

hace.

Como han señalado otros, solo necesitas cerrar el envoltorio externo.

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

Hay una posibilidad muy pequeña de que esto pueda filtrar un identificador de archivo si el constructor BufferedReader lanzó una excepción (por ejemplo, OutOfMemoryError ). Si su aplicación está en este estado, cuán cuidadoso debe ser su limpieza podría depender de cuán importante es que no prive al sistema operativo de los recursos que podría asignar a otros progtwigs.

La interfaz de Closeable se puede usar si es probable que un constructor de envoltura 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(); } 

El código de Java 7 debe usar el patrón try-with-resources :

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

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

El código fuente de BufferedReader muestra que el subyacente está cerrado cuando cierra el BufferedReader.

Después de verificar el código fuente, encontré eso para el ejemplo:

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

el método close () en el objeto BufferedReader llamaría al método abstract close () de la clase Reader que llamaría finalmente al método implementado en la clase InputStreamReader , que luego cerraría el objeto InputStream .

Entonces, solo bReader.close () es suficiente.

Solo necesita cerrar el bufferReader ie reader.close () y funcionará bien.

A partir de Java 7 puede usar la statement try-with-resources

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

Como la instancia de BufferedReader se declara en una instrucción try-with-resource, se cerrará independientemente de si la instrucción try se completa de forma normal o abrupta. Por lo tanto, no necesita cerrarlo usted mismo en la statement final. (Este es también el caso con declaraciones de recursos nesteds)

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

Intereting Posts