2010-07-12 29 views
11

我正在创建一个接受单个InputStream作为参数的Java方法。对于使用基于字符流工作的方便,我在方法开始实施包裹提供InputStream如下:如何避免关闭传递给我在Reader中包装的方法的InputStream?

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

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

有没有人看到一种方法让我关闭BufferedReaderInputStreamReader,我创建的时候没有关闭传递给我的方法的InputStream?也许有一种方法可以在我打包之前制作提供的InputStream的副本?由于

+1

你知道展开的流几乎没用吗? – 2010-07-12 16:22:05

+1

你应该在创建InputStreamReader时提供一个特定的“Charset”,而不是忽略它,并让平台默认使用。 – ColinD 2010-07-12 16:23:34

+0

汤姆,你能澄清一下你的意思吗?“解包后的流几乎没用”? – user389591 2010-07-13 14:38:21

回答

3

我会尝试将重写close方法:

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

疯狂的种类,但它应该工作。虽然,我不确定这是最好的方法。

我认为这是一个有趣的问题,所以我希望有专家给出他/她的意见。

4

个人而言,我只想通过改变你的方法的签名,要求一个BufferedReader(或阅读器)中通过避免这个问题。

+0

这将BufferedReader的创建传播给调用者。但是如果调用方法也从其他地方获取流呢? – 2010-07-12 16:13:57

+1

你有一个好点:有人可能希望提供一个基于'Reader'的版本。因为,如果某人得到一个非默认编码的'InputStream',她就不能使用基于流的方法,因为InputStreamReader使用了错误的编码。 – 2010-07-12 16:18:05

+0

'java.util.Properties'类提供'load(InputStream inStream)'和'load(Reader reader)'方法。我认为让你的班级的可能的客户有这两种选择是方便的,可以简化客户端代码。也就是说,客户端在将它作为参数传递给方法之前,不需要包装一个'InputStream'来获取'Reader'。 – user389591 2010-07-13 14:33:54

9

你不需要关闭BufferedReaderInputStreamReader或可能是最读者实现,当你不想关闭底层的读者。

这些读者没有任何资源,当你最终放弃对读者的引用时,对close()的调用将免费,并且垃圾回收器不会释放任何资源(例如本地资源或静态变量中的值)你的方法。

与本地资源通信的底层输入流,例如, FileInputStream或从URL获取的流必须关闭才能释放这些本机资源。

对于Writer,有一个区别close()通常称为flush()。但是,您可以直接拨打flush()

+1

是的,尽管一些压缩流(虽然不是“读者”,据我所知)使用本地资源,需要关闭。 – 2010-07-12 16:21:38

+0

确实。因此,当你想将几个输出流连接在一起时,每一个输出流都被压缩成一个输出流,其中一个选项就是覆盖close方法,就像@Cristian C.所建议的那样。 (使用包含多个文件的压缩存档时可能发生类似的情况。) – 2010-07-12 16:40:43

相关问题