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

2022-09-02 13:26:58

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

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

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

有没有人看到一种方法让我关闭我创建的,而不关闭传递给我的方法?也许有一种方法可以在我包装之前制作所提供的副本?谢谢BufferedReaderInputStreamReaderInputStreamInputStream


答案 1

当您不希望关闭基础读取器时,不需要关闭或可能大多数读取器实现。BufferedReaderInputStreamReader

当您在方法末尾删除对读取器的引用时,这些读取器不会持有任何调用将变得可用且垃圾回收器无论如何都不会成为免费的资源(例如,本机资源或静态变量中的值)。close()

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

对于 ,有一个区别,通常调用 。但是,您可以直接致电。Writerclose()flush()flush()


答案 2

就个人而言,我可以通过更改方法的签名来要求传入BufferedReader(或Reader)来避免这个问题。


推荐