代码之家  ›  专栏  ›  技术社区  ›  java.is.for.desktop

在输入流结束后不关闭它有什么意义?

  •  5
  • java.is.for.desktop  · 技术社区  · 16 年前

    InputStream 器具 Closeable .

    我知道,关闭一个输入流 还没有结束 ,可以释放一些基础资源,并保持开放,可以让其他方法继续从中读取。

    但是,它有什么意义呢 不 关闭输入流 结束之后 ?
    如果没有意义,为什么到达inbuntstream的末尾并不意味着关闭呢?

    同样的问题也适用于 Reader .

    7 回复  |  直到 12 年前
        1
  •  9
  •   gpeche    16 年前

    mark() 和 reset() 允许您在接口的某些实现中“返回”。

    这在实现解析器和匹配regexp时非常有用,正如您通常希望的那样。 lookahead .

        2
  •  3
  •   Alexander Pogrebnyak    16 年前

    响应您对org.life.java的评论

    我知道,问题是:为什么 输入流的结尾并不意味着 关闭()?

    因为,对于某些流,您可以倒带它们并重新开始阅读。对于其他人,例如插座,这是不可能的,但他们必须遵守合同规则。

    另外,因为这是关闭流的方式(未显示异常处理):

    InputStream stream = openMethod( );
    
    try
    {
       consumeMethod( stream );
    }
    finally
    {
       stream.close( );
    }
    

    换句话说,无论您是否完全消耗了流,您都应该释放获得的资源。

        3
  •  3
  •   Thorbjørn Ravn Andersen    16 年前

    Windows下的一个原因可能是保持文件锁定。无法重命名、删除或移动打开的文件。

        4
  •  1
  •   Jeff    16 年前

    你可以 mark() 和 reset() 输入流。因此,一旦到达数据的末尾,您仍然可以返回到标记的位置。想要的人 重新设置() 输入流可能不希望它在末尾关闭。

        5
  •  0
  •   Femaref    16 年前

    我不知道Java中与输入流连接的语义,但一般来说,您可能不会关闭流,因为您自己并没有打开它,而是依赖于调用方(另一种方法)来关闭流。如果你自己打开了这条小溪,你应该总是把它关闭。

        6
  •  0
  •   Thilo    16 年前

    隐式关闭并不是很好,因为

    • 只有当流到达它的末尾时,才会执行此操作,而这种情况可能并不总是如此(在过程中会发生一些异常,或者您只读取文件的第一个字节),因此无论如何,您都必须处理这些其他情况。拥有一个几乎总是有效的隐式接近使人们更加忘记他们最后的阻碍。
    • 一些流可以重绕(标记/重置)。
        7
  •  0
  •   irreputable    16 年前

    从inputstream的API来看,特定的实现可以做到这一点,即在流的末尾关闭。对于很多河流来说,这可能是一个很好的主意。

    推荐文章