繁体   English   中英

关闭阅读器,使输入流保持打开状态

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM