日期:2014-05-20  浏览次数:20746 次

InputStream.available方法与BufferedReader.ready方法,求辨析
现在,有AB两个线程。
A线程启动一个exe,重定向错误流,然后getInputstream,把总的输出流传出来,交给线程B,自己waitfor(),直到最后。
B线程得到InputStream,由此构造一个BufferedReader,不断地读取(readline()),实时将这些文字输出掉。
问题出在B线程用的具体方法:
当我在一个while循环里持续监测 InputStream.available() > 0 条件,发现输出了一小段文字后(也许这时候exe的输出有一个几微秒的暂停,不是一次cout的),线程B就卡住了。
这时候exe肯定已经输出了更多的文字,因为我已经看到了exe输出文字后写下的文件,但是 InputStream.available() 取回的数值还是一直为零。
在这里卡了两天,最后我把InputStream.available() > 0 条件换成BufferedReader.ready,作为while循环的条件,执行就正常了,与预期的一样……
求教,这两个条件,在这个时候,作用难道不是一样的检测还有没有多余的输出吗?
我猜想,是不是因为getInputstream得到的 Inputstream ,实际上属于线程A,在线程B里用geter方法得到他之后不断地调用,实际上最线程A造成了阻塞,使其没有CPU资源去读取exe的输出文字?
求大神辨析!
代码太长,在另一台机器上,就不贴上来了吧……有人要再说……

------解决方案--------------------
你用BufferedReader读取数据,却去判断InputStream,感觉有点怪,虽然BufferedReader是用InputStream构建的
------解决方案--------------------
InputStream.available();
这个函数是非阻塞设计,在网络环境下,一旦遇到阻塞,返回值就会比实际流中的数据量小.
当返回数据较大,需要几个包来分开传送的时候,利用这个函数作为数组上限来获取数据,就会损失数据了