在结束后关闭InputStream会有什么意义呢?

时间:2010-09-08 12:33:37

标签: java io inputstream

InputStream实施Closeable

据我所知,关闭一个尚未结束的InputStream ,可以释放一些底层资源,并且让它保持打开状态,让其他方法继续从中读取是有意义的。

但是,在结束后关闭InputStream 会有什么意义? 如果它没有意义,为什么到达InpuntStream的末尾并不意味着关闭呢?

同样的问题适用于Reader

7 个答案:

答案 0 :(得分:9)

mark()reset()允许您在界面的某些实现中“返回”。

这在实现解析器和匹配正则表达式时非常有用,因为您通常需要lookahead

答案 1 :(得分:3)

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

  

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

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

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

InputStream stream = openMethod( );

try
{
   consumeMethod( stream );
}
finally
{
   stream.close( );
}

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

答案 2 :(得分:3)

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

答案 3 :(得分:1)

您可以mark()reset()一个InputStream。因此,一旦到达数据末尾,您仍然可以返回到您标记的位置。想要reset()一个InputStream的人可能不希望它最后关闭。

答案 4 :(得分:0)

我不知道java中与InputStream相关的语义,但一般来说,你可能不会关闭一个流,因为你没有自己打开它,只是对它做了工作,并依赖于主叫方(另一个)方法)关闭流。如果您自己打开了流,那么您总是关闭它。

答案 5 :(得分:0)

隐式关闭不会那么好,因为

  • 只有当流到达终点时才会这样做,这可能不是总是这样(某些异常发生在路上,或者你只读取文件的第一个字节),所以你必须处理这些其他无论如何。隐含的关闭几乎总是有效,这让人们更加忘记他们的最终障碍。
  • 某些流可以倒带(标记/重置)。

答案 6 :(得分:0)

从InputStream的API判断,特定实现没有问题,即在流结束时关闭。对于很多流来说,这可能是一个非常好的主意。