如果我得到FileNotFoundException,我应该关闭输出流吗?和IOException?

时间:2016-01-26 11:16:52

标签: java android memory-leaks

我有这段代码:

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

我是否需要关闭FileOutputStream catch块中的FileNotFoundException

如果抛出该异常意味着无法打开文件,那么我认为没有必要。但是,我认为在IOException catch块中这样做会很好。

如果我不这样做,是否会导致任何内存泄漏错误或类似内容?

感谢。

3 个答案:

答案 0 :(得分:1)

如果您使用的是Java 7或更高版本,则应使用尝试使用资源并让系统决定。

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

如果没有,那么只需确保该流不是null,而是在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 :(得分:1)

没有什么可以关闭的。 FileOutputStream构造函数引发了异常;溪流从未建成;从未分配fos变量;它超出了catch块的范围。

答案 2 :(得分:0)

完成读取或写入后,应始终关闭文件。否则,您将保持资源繁忙,一般来说可能是个问题 如果以这种方式修改代码,则不必关心文件,java会考虑它。

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