情况一
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);
}