首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >告诉BufferedInputStream是否关闭

告诉BufferedInputStream是否关闭
EN

Stack Overflow用户
提问于 2014-09-26 09:29:52
回答 1查看 666关注 0票数 0

我有两个线程(主线程和工作线程)。

工作线程从某个套接字源读取输入(通过BufferedInputStream使“返回”成为可能),将读取的数据打包到数据结构中,并将结果添加到BlockingQueue (这是线程安全的)。

在某个时候,主线程决定结束它并关闭BufferedInputStream。

如何知道工作线程是否关闭了BufferedInputStream?

通常,mInputStream.read()在EOF上返回-1,但是当流关闭时不会发生这种情况。相反,会抛出一个IOException,告诉我流已关闭。

工作线程必须优雅地结束,但是it如何发现流是关闭的?

它不能从异常类中分辨原因:类只是IOException。它可以测试e.getMessage().contains("closed"),但它很容易出错:在某些版本的Android上,信息可能是“关闭”或“不打开”,而像“除非关闭”这样的散文则会产生假阳性。

我想到的最好的事情是:

代码语言:javascript
复制
private static boolean _isOpen(InputStream inputStream) {
    try {
        inputStream.available();
    } catch (IOException e) {
        return false;
    }
    return true;
}

这种副作用(抛出异常)已经有了一定的记录,但是测试流是否关闭并不是available()的主要功能;总有一天,有人会编写一个只返回0的实现。

还有其他建议吗?

EN

回答 1

Stack Overflow用户

发布于 2014-09-26 09:41:25

异常仅用于“异常”状态条件,例如连接失败或磁盘故障。

因此,听起来似乎无法让主线程指示工作线程停止处理流,这在主线程拥有资源的情况下通常会发生。

此外,JDK文档(http://docs.oracle.com/javase/7/docs/api/java/io/InputStream.htmls声明:

类InputStream的可用方法总是返回0。 引发: IOException -如果发生I/O错误。

正如问题的注释中所建议的:简单地从流中读取并捕获IOExceptions。如果资源变得不可用,工作线程将通过这种方式获得异常来注意。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26056329

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档