为什么我需要关闭流

时间:2016-02-05 09:25:45

标签: java stream fileinputstream

为什么我需要关闭Streams(FileInputStream等...)? 如果我没有关闭流,那么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();
        }
    }

我需要关闭我使用的所有流吗?

2 个答案:

答案 0 :(得分:2)

垃圾收集器用于收集未使用的对象。 流通常链接到许多资源(文件描述符,套接字等等),这些资源在您的计算机中更为重要。当然,他们可能会在程序退出时被释放,但他们应该尽可能少地保持开放

答案 1 :(得分:0)

这称为显式终止,它手动完成分配资源的对象,而不是使用终结器方法。我在这里引用Joshua Bloch的Effective Java:

  

那么你应该做些什么,而不是为一个班级写一个终结者   对象封装需要终止的资源,例如文件   还是线程?只需提供一个明确的终止方法,并要求   该类的客户端在每个实例上调用此方法   不再需要。值得一提的一个细节就是实例   必须跟踪它是否已被终止:明确的   终止方法必须在对象所在的私有字段中记录   不再有效,其他方法必须检查此字段并抛出一个   Illegal- StateException,如果它们在对象之后被调用   终止。显式终止方法的典型例子是   在InputStream,OutputStream和java.sql.Connection上关闭方法。   另一个例子是java.util.Timer上的cancel方法,