Tengo este código:

   private void save(Bitmap bitmap) {
        try {
            FileOutputStream fos = new FileOutputStream(path);
            bitmap.compress(Bitmap.CompressFormat.JPEG, COMPRESSION_QUALITY, fos);
            fos.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

¿Necesito cerrar FileOutputStream en el bloque de captura FileNotFoundException?

Si se lanza esa excepción significa que el archivo no se pudo abrir, así que creo que no sería necesario. Sin embargo, creo que sería bueno hacerlo en el bloque de captura IOException.

¿Podría causar algún error de pérdida de memoria o algo similar si no lo hago?

Gracias.

3
Héctor 26 ene. 2016 a las 14:16

3 respuestas

La mejor respuesta

Si está trabajando en Java 7 o superior, debería utilizar probar con recursos y dejar que el sistema decida.

private void save(Bitmap bitmap) {
    try (FileOutputStream fos = new FileOutputStream(path)) {
        bitmap.compress(Bitmap.CompressFormat.JPEG, COMPRESSION_QUALITY, fos);
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

De lo contrario, asegúrese de que la transmisión no sea null primero y hágalo en un finally.

private void save(Bitmap bitmap) {
    FileOutputStream fos = null;
    try {
        fos = new FileOutputStream(path);
        bitmap.compress(Bitmap.CompressFormat.JPEG, COMPRESSION_QUALITY, fos);
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        if (fos != null) {
            fos.close();
        }
    }
}
1
OldCurmudgeon 26 ene. 2016 a las 11:29

Siempre debe cerrar el archivo una vez que haya terminado de leer o escribir. De lo contrario, mantendrá el recurso ocupado y, en general, podría ser un problema.
Si modifica su código de esta manera, no tendrá que preocuparse por cerrar el archivo y Java lo pensará.

    private void save(Bitmap bitmap) {
       try(FileOutputStream fos = new FileOutputStream(path)) {
          bitmap.compress(Bitmap.CompressFormat.JPEG, COMPRESSION_QUALITY, fos);
       } catch (FileNotFoundException e) {
          e.printStackTrace();
       } catch (IOException e) {
          e.printStackTrace();
       }
    }
0
Tommaso Pasini 26 ene. 2016 a las 11:24

No hay nada que cerrar. El constructor FileOutputStream lanzó una excepción; el arroyo nunca fue construido; la variable fos nunca ha sido asignada; y está fuera del alcance en el bloque catch.

1
Marquis of Lorne 26 ene. 2016 a las 11:31