Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么我需要关闭流_Java_Stream_Fileinputstream - Fatal编程技术网

Java 为什么我需要关闭流

Java 为什么我需要关闭流,java,stream,fileinputstream,Java,Stream,Fileinputstream,为什么我需要关闭流(FileInputStream等)? 如果我没有关闭流,Java是否不智能地使用GC public void getLongStrings() throws IOException { InputStream i1 = null; InputStream i2 = null; InputStreamReader isr1 = null; InputStreamReader isr2 = null;

为什么我需要关闭流(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();
        }
    }

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

这称为显式终止,它手动终止分配资源的对象,而不是使用终结器方法。我在这里引用约书亚·布洛赫(Joshua Bloch)的有效Java:

那么,您应该怎么做,而不是为 对象封装需要终止的资源,例如文件 还是线程?只需提供一个显式终止方法,并要求 类的客户端,以便在每个实例上调用此方法 不再需要了。值得一提的一个细节是 必须跟踪是否已终止:显式 终止方法必须在私有字段中记录对象是 不再有效,其他方法必须检查此字段并抛出 非法-如果在创建对象后调用它们,则为StateException 结束。显式终止方法的典型示例如下: 关闭InputStream、OutputStream和java.sql.Connection上的方法。 另一个例子是java.util.Timer上的cancel方法


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

是的,您需要关闭流,因为流已经充满了内容,当您关闭流时,您可以再次使用它。当使用flush方法时,数据也会在驱动器中刷新。当您关闭流时,JVM将看到流不可用,无法用于进一步操作。可能重复我离开您家时我是否应该关门,或者我是否应该假设您会走到我身后处理它?您应该查看是否是您所反对的代码量。当JVM离开时,会触发垃圾收集内存,而不是当文件描述符用完时。因此,依赖垃圾收集为您清理可能不会在您需要时为您留下足够的描述符。