代码之家  ›  专栏  ›  技术社区  ›  Dave

Java: Celead.Cuffer()关闭任何链接的读取器吗?

  •  12
  • Dave  · 技术社区  · 15 年前

    假设我做了如下的事情:

    Reader r = new BufferedReader(new FileReader(file));
    
    ... read ...
    
    r.close()
    

    这是否会关闭底层的文件读取器(并释放打开的文件句柄)?

    -戴夫

    4 回复  |  直到 15 年前
        1
  •  17
  •   Community Dunja Lalic    7 年前

    是的,打电话 close 在最外面 Reader 就足够了。

    这个 Java I/O Streams 文章在 Sun Developer Network 在上有节 流链接 上面写着:

    FileOutputStream  fos = new FileOutputStream("myfile.out");   
    CryptOutputStream cos = new CryptOutputStream(fos);   
    GZIPOutputStream  gos = new GZIPOutputStream(cos);
    

    […]

    当关闭链条时 流,你只需要关闭 最外面的流类,因为 close() 呼叫被自动欺骗 在所有被链接的类中;在 上面的例子,您只需 打电话给 关闭() 方法在 GZIPOutputStream 班级。

    因此,在这种情况下,人们只需要打电话 关闭 BufferedReader .

    作为 dtsazza already mentioned , the Java API Specification 对于 BufferedReader 班上说 BufferedReader.close 方法将释放任何基础资源:

    关闭流并释放与其关联的任何系统资源。[…]

    因此,我们可以推断 读者 S,即使它可能没有明确地这么说。

        2
  •  4
  •   Andrzej Doyle    15 年前

    根据 the documentation 它只是“释放与[读卡器]相关联的任何系统资源”。读卡器是否关闭任何嵌套的读卡器是特定类的实现问题。

    在您提到的具体示例中-是的,a BufferedReader 将始终关闭嵌套的读取器。但是当这个 通常 但这并不一定意味着 全部的 的实现 Reader 具有某种嵌套读取器的接口将传播 close() 调用它们-您需要检查特定类的文档才能找到答案。

        3
  •  0
  •   Community Dunja Lalic    7 年前

    对。是的。我用它做插座时发现了这个。

    My Question

    基本上,你只是不能关闭它,直到你完成与家长。对于套接字,这实际上会关闭您的套接字。:。-(

        4
  •  0
  •   rodrigoap    15 年前

    是的,这是装饰图案。