我正在创建一个接受单个InputStream
作为参数的Java方法。为了方便使用基于字符的流,我在方法实现的开头包装了提供的InputStream
,如下所示:
public void doStuff(InputStream inStream) {
BufferedReader reader = new BufferedReader(new InputStreamReader(inStream));
...
}
由于InputStream
(inStream
)传递给我的方法,我不想关闭它...因为我认为应该是客户端调用我的方法的责任(是这个假设是否正确?)。但是,我认为我应该关闭我创建的BufferedReader
;但在这样做时,我相信它会自动关闭所有其他组合流,包括inStream
。
有没有人看到我关闭我创建的BufferedReader
和InputStreamReader
而不关闭传递给我方法的InputStream
的方法?也许有一种方法可以在我包装之前复制所提供的InputStream
?感谢
答案 0 :(得分:10)
当您不想关闭基础读者时,您无需关闭BufferedReader
或InputStreamReader
或可能是大多数读者实施。
当您放弃对读者的引用时,这些读者不会拥有任何对close()
的调用可以释放的资源以及垃圾收集器无论如何都不会自由(例如本机资源或静态变量中的值)在你的方法结束时。
与本机资源通信的基础输入流,例如必须关闭FileInputStream
或从网址获取的流才能释放这些原生资源。
对于Writer
,close()
通常会调用flush()
,这有所不同。但是,您可以直接致电flush()
。
答案 1 :(得分:4)
就个人而言,我只是通过更改方法的签名来要求传入BufferedReader(或Reader)来避免此问题。
答案 2 :(得分:3)
我会尝试覆盖close
方法:
BufferedReader reader = new BufferedReader(new InputStreamReader(inStream)){
public void close() throws IOException {
synchronized (lock) {
if (in == null)
return;
}
}
};
// rest of your code
有点疯狂,但应该有用。虽然,我不确定这是最好的方法。
我认为这是一个有趣的问题,所以我希望有专家给出他/她的意见。
答案 3 :(得分:2)
您可能会在类路径中找到该类。从冬眠和太阳知道实现。如果是这样,则可以将此类用作包装器。祝你好运。
这个带有apache-poi。
这是来自休眠状态。
这也有一种无操作的关闭方法。
从现在开始应该很清楚:不关闭输入流是常见的要求。这个来自 spring 。
多数民众赞成在我通常的类路径中。