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

use*_*591 13 java inputstream

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

public void doStuff(InputStream inStream) {
   BufferedReader reader = new BufferedReader(new InputStreamReader(inStream));
   ...
}
Run Code Online (Sandbox Code Playgroud)

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

有没有人看到我关闭BufferedReaderInputStreamReader创建的方式,而不是关闭InputStream传递给我的方法?也许有一种方法可以InputStream在我包装它之前制作一份副本?谢谢

Chr*_*rau 10

你并不需要关闭BufferedReaderInputStreamReader或可能是大多数读者的实现,当你不希望关闭底层的读者.

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

FileInputStream必须关闭与本机资源(例如,从URL获得的流)通信的基础输入流以释放这些本机资源.

因为Writer,close()通常是电话有区别flush().但是,你可以flush()直接打电话.


Pet*_*der 6

不关闭输入流

您可能会在类路径中找到此类。hibernate 和 sun 的实现是已知的。如果是这样,您可以使用此类作为包装器。祝你好运。

关闭忽略输入流

这个是 apache-poi 自带的。

关闭抑制输入流

这是来自休眠状态的。

保持活动输入流

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

StreamUtils.nonClosing() - Spring

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

这就是我通常的类路径的全部内容。


Cri*_*ian 3

我会尝试覆盖该close方法:

BufferedReader reader = new BufferedReader(new InputStreamReader(inStream)){
    public void close() throws IOException {
        synchronized (lock) {
            if (in == null)
                return;
        }
    }
};
// rest of your code
Run Code Online (Sandbox Code Playgroud)

有点疯狂,但应该有用。不过,我不确定这是最好的方法。

我觉得这个问题很有趣,希望有专家给出意见。