所有流和 bufferedReader 都需要关闭我的问题是如果
流和 bufferedReader 位于方法参数/参数内
也需要关闭吗?
正常代码示例:
InputStream i = entity.getContent();
i.close();
问:如果它位于仅传递的方法的参数内怎么办
public void doDownload(InputStream i, BufferedReader b) {
i.close();
b.close();
}
即使 inputstream 和 bufferedreader 只是一个参数,我也应该关闭它吗
并且没有对象?
这(主要)是一个风格问题,只要someone关闭它们。然而,一致的方法效果最好。管理此类资源的关键技术是使它们所有权明确:资源的所有者负责释放它。这种所有权可以在资源的生命周期内发生变化,但在任何时候都应该是明确的。
在这种情况下:
public void doDownload(InputStream i, BufferedReader b) { ... }
流和读取器不是通过此方法创建的,而是提供给它的。因此,调用者应该负责关闭它。该方法执行完毕后,它甚至可能继续使用该资源,因此不应关闭它。
然而,在某些情况下,调用方法可能是转移资源所有权的一种形式。一个明显的例子是Java中的流链接——通过包装另一个OutputStream来创建一个OuputStream意味着外部的OutputStream现在负责在内部的OutputStream自行关闭时关闭它。
在另一个例子中:
InputStream i = entity.getContent();
这取决于细微的差别。有没有getContent()
实际上方法create the InputStream
, 要不就获得参考到实际属于的资源entity
目的?在第一种情况下,调用者方法应该负责释放它。否则,实体类应该自行执行(根据RAII http://en.wikipedia.org/wiki/Resource_Acquisition_Is_Initialization图案)。
一个更清楚的例子是:
InputStream i = context.openFileInput(fileName);
在这种情况下,调用者显然负责创建InputStream
,因此负责关闭它。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)