[英]Close Reader, Make Input Stream Remained Opened
目前,我有一种方法:
void method(InputStream stream) {
// Create UTF-8 reader by wrapping up the stream.
}
我不想拥有接受Reader的方法的原因是,我希望自己的方法拥有自己的控件来决定应使用哪种编码类型。
问题是,每当我关闭Reader时,InputStream也会被关闭。 这不是我的意图。 由于InputStream被调用方“打开”。 因此,InputStream的关闭操作应在调用方完成。
有什么方法可以关闭“方法”中的阅读器,而无需关闭调用方传递的InputStream?
谢谢。
它不是那么漂亮,但应该可以工作。
final Reader reader = makeReader(new FilterInputStream(stream) {
@Override
public void close() {
// we don't close
}
});
如果您不想关闭输入流,请不要关闭阅读器。 毕竟,关闭阅读器除了关闭输入流外没有其他用途。
假设您的方法将关闭阅读器...如果不是,则在您自己的Reader
实现中覆盖close()
(例如,从InputStreamReader
派生),或者在FilterInputStream
覆盖close()
,按照其他答案精细。
编辑:评论表达了对资源泄漏的一些担忧。 的确, 从理论上讲 , InputStreamReader
(这是您最有可能使用的那种阅读器)可能会在幕后做其他事情……例如,将输出内容写入文件中。 实际上,这根本不会发生。 close()
只是要关闭流(实际上,至少是在JDK 6实现中,通过StreamDecoder
)。 涉及的唯一不受管理的资源是流本身...,您想有效地泄漏它。
对于输入流,没有“冲洗”这样的概念-它甚至会做什么? 除了输入流和内存中的结构外,基本上没有其他需要清理的地方……GC将负责内存,因此您已完成。
使用FilterInputStream
通常是一种更清洁的方法,我当然会承认-但对于这种特定情况,我不会关闭读者。 哎呀,这将使代码比平时更简单 ,因为您通常需要try / finally块来确保在所有情况下都将其关闭。 所有这些都可以解决。
请注意,如果您将阅读器发布到任何其他代码,则以上所有逻辑都是无效的-您希望关闭阅读器以阻止其他不应使用的代码。 但是,在这种情况下,我预计您将构造读取器,从中读取数据,然后只是让其收集垃圾,而不会在其他地方发布引用。
一种选择(当然并不总是适用)是通过仅发送阅读器而不是流来躲避整个事情:
void method(Reader reader) {
// Just read stuff!
}
...然后让调用代码担心打开和关闭阅读器。 这具有额外的好处,即您的代码不会被硬连线到使用UTF-8,并且由于您可以只发送StringReader
,因此变得更容易测试。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.