情况一
while((buff=in.readLine())!=null){//in是BufferedReader,字符流System.out.println(buff);
}
代码这样写时,能输出结果,但输出完成后依旧在等待对方返回信息。
情况二
System.out.println("in.available="+in.available());
while(in.available()>0){//in是InputStream字节流int len=in.read(buf,0,buf.length);if(len<0){break;}sb.append(new String(buf,0,len));
}
这样写的输出有问题,执行结果是上一条指令的执行结果,第一条指令没有输出。
原因
刚把指令传输给Linux,就立即执行读结果操作导致的。指令可能还在执行或者还在传输的过程中,就读取结果肯定是读不出来的。
解决方法
一、休眠几秒再读
Thread.sleep(1000);
System.out.println("in.available="+in.available());
while(in.available()>0){int len=in.read(buf,0,buf.length);if(len<0){break;}sb.append(new String(buf,0,len));
}
结果就正常了。
二、
如果之前的代码是这样写的,导致读完结果还是阻塞
while(true){while(in.available()>0){int len=in.read(buf,0,buf.length);if(len<0){break;}sb.append(new String(buf,0,len));}if(openChannel.isClosed()){if(in.available()>0){continue;}System.out.println("exit-status"+openChannel.getExitStatus());break;}
}
设置个超时时间,超时就跳出循环
long startTime = System.currentTimeMillis();
while(true){while(in.available()>0){int len=in.read(buf,0,buf.length);if(len<0){break;}sb.append(new String(buf,0,len));}if(openChannel.isClosed()){if(in.available()>0){continue;}System.out.println("exit-status"+openChannel.getExitStatus());break;}long endTime = System.currentTimeMillis();if(endTime-startTime>TIMEOUT) {break;}Thread.sleep(500);
}