Pio*_*paw 4 java android java-io
所有流和bufferedReader都需要关闭我的问题是如果流和bufferedReader在一个方法内,参数/参数也需要关闭吗?
示例普通代码:
InputStream i = entity.getContent();
i.close();
Run Code Online (Sandbox Code Playgroud)
问:如果它在一个仅传递的方法的参数内部会怎么样?
public void doDownload(InputStream i, BufferedReader b) {
i.close();
b.close();
}
Run Code Online (Sandbox Code Playgroud)
即使输入流和bufferedreader只是一个参数而没有对象,我也应该关闭它吗?
这(主要)是风格问题,只要有人关闭它们.但是,一致的方法效果最好.管理这种资源的关键技术是使其所有权变得清晰:资源的所有者负责释放它.这种所有权可以在资源的生命周期内发生变化,但任何时候都应该清楚.
在这种情况下:
public void doDownload(InputStream i, BufferedReader b) { ... }
Run Code Online (Sandbox Code Playgroud)
流和阅读器不是由这种方法创建的,而是提供给它的.因此,调用者应该负责关闭它.在此方法完成执行后,它甚至可能继续使用资源,因此不应该关闭它.
但是,在某些情况下,调用方法可能是转移资源所有权的一种形式.一个明显的例子是Java中的流链接 - 通过包装另一个OutputStream创建一个OuputStream意味着外部的一个现在负责在它自己关闭时关闭内部的一个.
在另一个例子中:
InputStream i = entity.getContent();
Run Code Online (Sandbox Code Playgroud)
这取决于一个微妙的差异.该getContent()方法是否实际创建了InputStream,或者只获取对实际属于该entity对象的资源的引用?在第一种情况下,然后调用方法应该负责释放它.否则,Entity类应该自行执行(根据RAII模式).
一个更明确的例子是:
InputStream i = context.openFileInput(fileName);
Run Code Online (Sandbox Code Playgroud)
在这种情况下,调用者显然负责创建InputStream,因此负责关闭它.
| 归档时间: |
|
| 查看次数: |
1353 次 |
| 最近记录: |