java 调用其他程序,watiFor方法会引起超时异常,处理方案,需要把缓冲区里面的内容获取出来,避免缓冲区被占满。
实例图:
实例代码:
public class CommandUtil {
//保存进程的输入流信息
private List<String> stdOutList = new ArrayList<>();
//保存进程的错误流信息
private List<String> errOutList = new ArrayList<>();
/**
*
*执行程序
*
* @param command
* @return 0:正常退出;-1:错误
*/
public int executeCommand(String command){
//clear
stdOutList.clear();
errOutList.clear();
Process p = null;
try {
p = Runtime.getRuntime().exec(command);
new ReadStreamThread(p.getInputStream(),stdOutList).start();
new ReadStreamThread(p.getErrorStream(),errOutList).start();
//the calling thread will be blocked until the subprocess exits
int exitValue = p.waitFor();
return exitValue;
} catch (IOException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
return -1;
}
}
class ReadStreamThread implements Runnable{
//set read encoding
private String character = "UTF-8";
private List<String> list;
private InputStream inputStream;
public ReadStreamThread(InputStream inputStream, List<String> list){
this.inputStream = inputStream;
this.list = list;
}
public void start(){
Thread thread = new Thread(this);
thread.setDaemon(true);//将其设置为守护线程
thread.start();
}
@Override
public void run() {
BufferedReader br = null;
try {
br = new BufferedReader(new InputStreamReader(inputStream,character));
String line = null;
while ((line = br.readLine())!=null){
if(line!=null){
list.add(line);
}
}
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally {
try{
if(inputStream!=null){
inputStream.close();
}
if(br!=null){
br.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}