判断BufferedInputStream是否已关闭

时间:2014-09-26 09:29:53

标签: java android

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

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

在某个时刻,主线程决定用它完成并关闭BufferedInputStream。

工作线程如何判断BufferedInputStream是否已关闭?

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

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

它无法从异常类中分辨出原因:该类只是IOException。 它可以测试是否e.getMessage().contains("closed"),但它容易出错:在某些版本的Android上,该消息可能恰好是“关闭”或“未打开”,而像“除非关闭”这样的散文将导致误报

我想到的最好的事情是:

private static boolean _isOpen(InputStream inputStream) {
    try {
        inputStream.available();
    } catch (IOException e) {
        return false;
    }
    return true;
}

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

还有其他建议吗?

1 个答案:

答案 0 :(得分:-1)

例外意味着用于"例外"仅限状态条件,例如连接失败或磁盘故障。

所以听起来好像你不能让主线程指示worker-thread停止处理流,这通常发生在主线程拥有资源的场景中。

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

  

InputStream 可用方法始终返回0.

     

抛出:       IOException - 如果发生I / O错误。

正如问题的评论中所建议的:只需从流中读取并捕获IOExceptions。如果资源变得不可用,工作线程将通过这种方式获取异常来通知。