如何避免关闭传递给我在Reader流中包装的方法的InputStream?

时间:2010-07-12 15:41:51

标签: java inputstream

我正在创建一个接受单个InputStream作为参数的Java方法。为了方便使用基于字符的流,我在方法实现的开头包装了提供的InputStream,如下所示:

public void doStuff(InputStream inStream) {
   BufferedReader reader = new BufferedReader(new InputStreamReader(inStream));
   ...
}

由于InputStreaminStream)传递给我的方法,我不想关闭它...因为我认为应该是客户端调用我的方法的责任(是这个假设是否正确?)。但是,我认为我应该关闭我创建的BufferedReader;但在这样做时,我相信它会自动关闭所有其他组合流,包括inStream

有没有人看到我关闭我创建的BufferedReaderInputStreamReader而不关闭传递给我方法的InputStream的方法?也许有一种方法可以在我包装之前复制所提供的InputStream?感谢

4 个答案:

答案 0 :(得分:10)

当您不想关闭基础读者时,您无需关闭BufferedReaderInputStreamReader或可能是大多数读者实施。

当您放弃对读者的引用时,这些读者不会拥有任何对close()的调用可以释放的资源以及垃圾收集器无论如何都不会自由(例如本机资源或静态变量中的值)在你的方法结束时。

与本机资源通信的基础输入流,例如必须关闭FileInputStream或从网址获取的流才能释放这些原生资源。

对于Writerclose()通常会调用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)

NoCloseInputStream

您可能会在类路径中找到该类。从冬眠和太阳知道实现。如果是这样,则可以将此类用作包装器。祝你好运。

CloseIgnoringInputStream

这个带有apache-poi。

CloseSuppressingInputStream

这是来自休眠状态。

KeepAliveInputStream

这也有一种无操作的关闭方法。

StreamUtils.nonClosing()-春季

从现在开始应该很清楚:不关闭输入流是常见的要求。这个来自 spring

多数民众赞成在我通常的类路径中。