【发布时间】:2010-01-23 18:03:41
【问题描述】:
我有一个BufferedReader(由new BufferedReader(new InputStreamReader(process.getInputStream())) 生成)。我对BufferedReader 的概念很陌生,但在我看来,它具有三种状态:
- 有一行等待读取;调用
bufferedReader.readLine将立即返回此字符串。 - 流已打开,但没有等待读取的行;调用
bufferedReader.readLine将挂起线程,直到有一行可用。 - 流已关闭;调用
bufferedReader.readLine将返回 null。
现在我想确定BufferedReader 的状态,以便确定是否可以在不挂起应用程序的情况下安全地读取它。底层过程(见上文)是出了名的不可靠,因此可能已经挂起;在这种情况下,我不希望我的主机应用程序挂起。因此,我正在实施一种超时。我试着先用线程来做这件事,但它变得非常复杂。
调用BufferedReader.ready() 不会区分上述情况(2)和(3)。换句话说,如果ready() 返回 false,则可能是流刚刚关闭(换句话说,我的底层进程正常关闭)或者底层进程挂起。
所以我的问题是:如何确定我的BufferedReader 处于这三个状态中的哪一个而不实际调用readLine?不幸的是,我不能只打电话给readLine 来检查这个,因为它会打开我的应用程序。
我使用的是 JDK 1.5 版。
【问题讨论】:
-
顺便说一下,我暂时假设我的底层进程不能挂在一行中间......虽然这可能是一个错误的假设,但它没有发生到目前为止,在测试期间,我遇到了足够多的其他问题!
-
注:我目前正在寻找除线程之外的其他选项。问题是我的应用目前无法运行(由于多种原因,包括 readLine),而且我发现线程很难调试,尤其是在它们超时的情况下。