当我们在java 里去执行平台系统命令时,有时候会碰到运行无响应的问题。这里主要是系统平台提供的缓存大小在作怪。
比如你执行ipconfig和ipconfig /all,系统返回的字符多少不一样。返回的字符串大于缓存,那么就会出问题。导致线程死在那里。
code :
String rs = null;
try {
Runtime rt = Runtime.getRuntime();
Process proc = null;
InputStreamReader isr = null;
BufferedReader br = null;
String line =null;
proc = rt.exec("cmd /c ipconfig /all ");
isr = new InputStreamReader(proc.getInputStream());
br = new BufferedReader(isr);
while ((line = br.readLine()) != null){
if (line.contains("Physical Address")){
line = line.substring(line.indexOf(":")+1);
line = line.trim();
line = line.replace("-", "");
rs = line;
break;
}
}
proc.waitFor();
proc.destroy();
}
由于运行时io buffer的问题,当输出的字串大于buffer时会hang up. 所以read 此时的buffer时要注意。上面的代码可以解决这个问题,但是具体原因有待于查明。
问题主要出在proc.waitFor(); 要在waitFor之前处理掉buffer里的东西。另外一种方法就是,起一个单独的线程去处理buffer里的东西。
new PrintOut extends Thread{
BufferedReader br;
public PrintThread(InputStream is) {
br = new BufferedReader(new InputStreamReader(is));
}
public void run() {
String line;
try {
while (null != (line = br.readLine())) {
System.out.println(">" + line);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}