目前,我有一个方法:
void method(InputStream stream) {
// Create UTF-8 reader by wrapping up the stream.
}
我不想让方法接受Reader的原因是,我希望我自己的方法有自己的控制来决定应该使用什么类型的编码。
问题是,每当我关闭Reader时,InputStream也会被关闭。这不是我的意图。由于调用者“打开”了InputStream。因此,InputStream的关闭操作应在调用者端完成。
有没有办法可以在“方法”中关闭Reader,而不关闭调用者传递的InputStream?
感谢。
答案 0 :(得分:4)
它不是那么漂亮但应该有用。
final Reader reader = makeReader(new FilterInputStream(stream) {
@Override
public void close() {
// we don't close
}
});
答案 1 :(得分:4)
如果您不想关闭输入流,请不要关闭阅读器。毕竟,关闭阅读器除了关闭输入流之外没有其它用途。
假设您的方法将关闭读者...如果不是,则在您自己的close()
实现中覆盖Reader
(例如从InputStreamReader
派生)或覆盖<{1}}中close()
根据其他答案应该没问题。
FilterInputStream
(这是你最有可能使用的那种读者)确实可以在幕后做其他事情......将输出写入a例如,文件就像它一样。实际上,这根本就不会发生。 InputStreamReader
只是关闭流(实际上是通过close()
- 至少在JDK 6实现中)。所涉及的唯一非托管资源是流本身......并且您希望有效地泄露它。
对于输入流,没有“冲洗”这样的概念 - 它甚至会做什么?除了内存中的输入流和结构之外,基本上没有任何东西可以清理...... GC会处理内存,所以你已经完成了。
使用StreamDecoder
是一种通常更清晰的方法,我当然会承认 - 但对于这个具体案例我不会关闭读者。哎呀,这会使代码比正常更简单,因为你通常需要一个try / finally块来确保在所有情况下都关闭它。所有这些都可以去。
请注意,如果您将阅读器发布到任何其他代码,则上述所有逻辑都将无效 - 您希望关闭阅读器以阻止其他代码在不应该使用时使用它。在这种情况下,我预计你将构建阅读器,从中读取,然后让它被垃圾收集,从不在其他地方发布引用。
答案 2 :(得分:0)
一种替代方案(诚然并不总是适用)是通过发送阅读器代替流来避开整个事情:
void method(Reader reader) {
// Just read stuff!
}
...然后让调用代码担心打开和关闭阅读器。这样做的另一个好处是,您的代码不会硬连接到使用UTF-8,并且由于您可以发送StringReader
,因此更容易测试。