InputStream
实施Closeable
。
据我所知,关闭一个尚未结束的InputStream ,可以释放一些底层资源,并且让它保持打开状态,让其他方法继续从中读取是有意义的。
但是,在结束后关闭InputStream 会有什么意义不? 如果它没有意义,为什么到达InpuntStream的末尾并不意味着关闭呢?
同样的问题适用于Reader
。
答案 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判断,特定实现没有问题,即在流结束时关闭。对于很多流来说,这可能是一个非常好的主意。