是否需要在android中关闭参数/参数InputStream?

时间:2014-05-29 03:17:32

标签: java android java-io

所有流和bufferedReader需要关闭我的问题是如果 stream和bufferedReader在方法arguments / parameters中 需要关闭吗?

示例普通代码:

InputStream i = entity.getContent();
i.close();

问:如果它在一个仅传递

的方法的参数内部怎么办?
public void doDownload(InputStream i, BufferedReader b) {
    i.close();
    b.close();
}

即使输入流和bufferedreader只是一个参数,我也应该关闭它 并且没有对象?

1 个答案:

答案 0 :(得分:6)

这主要是风格问题,只要某人关闭它们。但是,一致的方法效果最好。管理此类资源的关键技术是使其所有权清除:资源的所有者负责释放它。这种所有权可以在资源的生命周期内发生变化,但任何时候都应该清楚。

在这种情况下:

public void doDownload(InputStream i, BufferedReader b) { ... }

流和阅读器不是由这种方法创建的,而是提供给它的。因此,调用者应该负责关闭它。在此方法完成执行后,它甚至可能继续使用资源,因此不应该关闭它。

但是,在某些情况下,调用方法可能是转移资源所有权的一种形式。一个明显的例子就是Java中的流链接 - 通过包装另一个OutputStream创建一个OuputStream意味着外部的一个现在负责在它自己关闭时关闭内部的一个。

在另一个例子中:

InputStream i = entity.getContent();

这取决于微妙的差异。 getContent()方法实际创建 InputStream,或只是获取实际属于entity对象的资源的引用 ?在第一种情况下,然后调用方法应该负责释放它。否则,Entity类应该自行执行(根据RAII模式)。

一个更明确的例子是:

InputStream i = context.openFileInput(fileName);

在这种情况下,调用者显然负责创建InputStream,因此负责关闭它。