Pregunta

Al leer de un archivo de texto, uno típicamente crea un FileReader y luego anuda eso en un BufferedReader. ¿Cuál de los dos lectores debería cerrar cuando haya terminado de leer? ¿Importa?

FileReader fr = null;
BufferedReader br = null;
try
{
    fr = new FileReader(fileName);
    br = new BufferedReader(fr);
    // ...
}
finally
{
    // should I close fr or br here?
}

Soy un poco paranoico cuando se trata de seguridad de excepción. ¿Qué pasa cuando el BufferedReader ¿El constructor lanza una excepción? ¿Cierra al lector anidado? ¿O está garantizado no lanzar?

¿Fue útil?

Solución

En general, close() En el envoltorio de flujo más externo llamará close() en las corrientes envueltas. Sin embargo, si cree que es probable que un constructor organice una excepción, haga un uso liberal del Cierre interfaz.

FileReader fr = new FileReader(fileName);
Closeable res = fr;
try {
    BufferedReader br = new BufferedReader(fr);
    res = br;
} finally {
    res.close();
}

Entonces, incluso si el JVM se quedó sin espacio para el búfer y arrojó un error, no filtrará un mango de archivo.

Para Java 7 y superior, use Try-with-Resources:

try (FileReader fr = new FileReader(fileName);
    BufferedReader br = new BufferedReader(fr)) {
  // do work
}

Otros consejos

Cerrando solo el BufferedReader es suficiente, porque envuelve el FileReader. Si miras el código fuente de BufferedReader Verás que el close Método, cierra la corriente envuelta.

Cierre el lectora de buffered en un bloque finalmente.

Si llama al método Close del BufferedReader, el BufferedReader llamará al método cercano del FileReader. Por lo tanto, se llaman a ambos métodos cercanos. Más precisamente, el BufferedReader no hará nada PERO Llamar al método cercano del FileReader. Por lo tanto, no importa en absoluto. Aunque creo que también es una buena práctica llamar al método cercano del BufferedReader.

Nada está garantizado de no tirar. Debido a que se asigna el búfer, puede tirar deMemoryError. Por lo general, separo mi código en 2 secciones: adquirir recursos y luego uso recursos. Cada sección generalmente tiene necesidades de limpieza únicas

Aquí está el código para ilustrar:

// Acquire resources section.

final FileReader fr = new FileReader( fileName );

BufferedReader br = null;

try
{
    br = new BufferedReader(fr);
}
finally
{
    if ( br == null )
    {
        // Note that you are closing the fr here
        fr.close( );
    }
}

// Use resources section
try
{
    // ... use br
}
finally
{
    // Now that br is safely constructed, just all its close
    br.close( );
}

Y estoy de acuerdo con usted, no hay nada que valga la pena perder silenciosamente un controlador de archivos en la aplicación de servidor de larga duración.

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