33 votos

El cierre de una Java FileInputStream

Bien, he estado haciendo la siguiente variable (los nombres han sido cambiados):


FileInputStream fis = null;
try
{
    fis = new FileInputStream(file);

    ... process ...

     if (fis != null)
        fis.close();
}
catch (IOException e)
{
    ... blah blah blah ...
}

Recientemente, he empezado a usar FindBugs, lo que sugiere que no soy cerrar adecuadamente los arroyos. Me decido a ver si hay algo que se puede hacer con un finally{} bloque, y luego veo, oh, sí, close() puede lanzar IOException. ¿Qué diablos se supone que la gente a hacer aquí? Las bibliotecas de Java tirar demasiadas excepciones comprobadas.

ACTUALIZACIÓN: ¡Caramba, eso es lo que pensé que debería ser hecho. Blech, oh bien.

45voto

McDowell Puntos 62645

Este patrón se evita ensuciar alrededor con null:

	try {
		InputStream in = new FileInputStream(file);
		try {
			// TODO: work
		} finally {
			in.close();
		}
	} catch (IOException e) {
		// TODO: error handling
	}


EDIT: para más detalle sobre cómo tratar efectivamente con cerrar, leer este post en el blog: Java: cómo no hacer un lío de flujo de manejo. Tiene más ejemplos de código, más profundidad y cubre las dificultades de ajuste de cierre en una captura de bloque.

32voto

skaffman Puntos 197885

Max la respuesta es la correcta, y sí, es molesto detallado. Usted puede hacer un poco menos por extraer el contenido de un finalmente reloj en un método de utilidad que se puede volver a utilizar.

De hecho, commons-io dispone de una útil IOUtils clase que tiene variouas closeQuietly() métodos para este fin.

http://commons.apache.org/io/api-release/org/apache/commons/io/IOUtils.html

http://commons.apache.org/io

InputStream fis = null;
try {
    fis = new FileInputStream(file);

    ... process ...


} catch (IOException e) {
    ... blah blah blah ...
} finally {
    IOUtils.closeQuietly(fis);
}

26voto

Max Stewart Puntos 2875

Algo similar a lo siguiente debería hacerlo, depende de usted si se lanza o se trague el IOException en el intento de cerrar el stream.

FileInputStream fis = null;
try
{
    fis = new FileInputStream(file);

    ... process ...


}
catch (IOException e)
{
    ... blah blah blah ...
}
finally
{
    try
    {
        if (fis != null)
            fis.close();
    }
    catch (IOException e)
    {
    }
}

10voto

Edwin Dalorzo Puntos 19899

Se podría usar el try-con-los recursos de la función de agregado JDK7. Fue creado precisamente para tratar con este tipo de cosas

static String readFirstLineFromFile(String path) throws IOException {
  try (BufferedReader br = new BufferedReader(new FileReader(path))) {
    return br.readLine();
  }
}

El documenation dice:

El tratar con los recursos de la declaración se asegura de que cada recurso está cerrado al final de la declaración.

3voto

serg10 Puntos 10157

No hay mucho para agregar, a excepción de una muy menor estilística sugerencia. El ejemplo canónico de auto documentar el código se aplica en este caso - dar un descriptivos nombre de la variable a la ignorado IOException que usted debe tomar en close().

Así squiddle la respuesta es:

public static void closeQuietly(InputStream s) {
   try {
      s.close();
   } catch (IOException ignored) {
   }
}

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X