为什么我需要关闭Streams(FileInputStream etc..(?如果我没有关闭流,Java 使用 GC 是不明智的吗?
public void getLongStrings() throws IOException {
InputStream i1 = null;
InputStream i2 = null;
InputStreamReader isr1 = null;
InputStreamReader isr2 = null;
try {
i1 = aBook.getInputStream();
i2 = aNovel.getInputStream();
isr1 = new InputStreamReader(i1);
isr2 = new InputStreamReader(i2);
foo = FileCopyUtils.copyToString(isr1);
bar = FileCopyUtils.copyToString(isr2);
}
catch (IOException ioe) {
//do something appropriate here
} finally {
if (i1 != null) i1.close();
if (i2 != null) i2.close();
if (isr1 != null) isr1.close();
if (isr2 != null) isr2.close();
}
}
我是否需要关闭我使用的所有流?
垃圾回收器旨在收集未使用的对象。流通常链接到许多资源(文件描述符、套接字等(,这些资源在您的机器中更为重要。当然,它们可能会在程序退出时被释放,但它们应该尽可能少地保持开放状态。
这称为显式终止,它手动完成分配资源的对象,而不是使用终结器方法。我在这里引用Joshua Bloch的Effective Java:
那么你应该怎么做,而不是为一个类编写一个终结器,其 对象封装需要终止的资源,例如文件 还是线程?只需提供显式终止方法,并要求 类的客户端,用于在每个实例上调用此方法,当它 不再需要。值得一提的一个细节是,实例 必须跟踪它是否已终止:显式 终止方法必须在私有字段中记录对象是 不再有效,其他方法必须检查此字段并抛出 非法 - 状态异常,如果在对象之后调用它们 终止。显式终止方法的典型示例是 关闭 InputStream、OutputStream 和 java.sql.Connection 上的方法。 另一个例子是java.util.Timer上的cancel方法,