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

标签 java android java-io

所有流和 bufferedReader 都需要关闭我的问题是如果 流和 bufferedReader 在方法参数/参数中 也需要关闭?

示例普通代码:

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

问:如果它在一个只被传递的方法的参数中怎么办

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

即使 inputstream 和 bufferedreader 只是一个参数,我也应该关闭它吗 没有对象?

最佳答案

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

在这种情况下:

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

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

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

在另一个例子中:

InputStream i = entity.getContent();

这取决于细微的差别。 getContent() 方法实际上创建 InputStream,还是只是获取对实际属于的资源的引用entity 对象?在第一种情况下,调用者方法应该负责释放它。否则,实体类应该自己做(根据 RAII 模式)。

一个更清楚的例子是:

InputStream i = context.openFileInput(fileName);

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

关于java - 是否需要在 android 中关闭参数/参数 InputStream?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23925151/

相关文章:

java - Android NullPointerException - 调试特定行

java - 高效解析个位数算术表达式

java - 通过鼠标单击添加/删除

android - 如何从 Android appcompat v7 21 库中设置 DrawerArrowToggle 的样式

android - 使用计算机的谷歌云消息传递

java - RSA加密Android和Java中的解密: javax. crypto.BadPaddingException:解密错误

java - 排序列表抛出 ArrayIndexOutOfBoundsException

java - 两个与Java类似的复制代码,两种行为

java - 在 Java 中读取文件(使用 IDE)

java - 如何将 java.io.ObjectInputStream 转换为 java.util.stream.Stream?