工作原因,需要写一个程序,使用CMD调用另外一个jar,把输出保存在string中。
看着没啥的一个东西,结果折腾了我一天。
Key point:
1.
当你重定向了输出以后,必须把process.getInputStream()和process.getErrorStream()里面都处理干净,程序才会结束。
比如你调用的程序输出了error,结果你处理输出的时候只处理了process.getInputStream(),程序就会一直卡在那。
2. 因为error和output可能是混合输出的,所以,
你必须起两个线程,同时处理这两个流,否则就锁死了。
例如有如下输出:
1. start ......
2. error ......
3. end ......
1和3是标准输出流,2是错误流。 如果你处理的时候先处理了标准输出流,那么会先处理1, 这时候就在等待2被处理,如果你没写处理错误流的方法,那么程序就会卡在这,直到你处理完2.
同样的,如果你是单线程,卡在处理标准输出流的位置,同样一直进不了错误流的处理部分,还是卡死。
所以,需要起两个进程,并行处理,一个读标准输出,一个读错误,这两个就可以交替进行了。
下面贴上代码:
-
import java.io.BufferedReader;
-
import java.io.IOException;
-
import java.io.InputStream;
-
import java.io.InputStreamReader;
-
-
public class Calculate {
-
-
-
private static String RunCMD(String cmdstr) throws IOException, InterruptedException {
-
-
StringBuilder sbout = new StringBuilder();
-
-
// run.exec("cmd /k shutdown -s -t 3600");
-
Process process = Runtime.getRuntime().exec("cmd.exe /c " + cmdstr);
-
-
BufferedReader bfout = new BufferedReader(new InputStreamReader(
-
process.getInputStream()));
-
final InputStreamReader err = new InputStreamReader(
-
process.getErrorStream());
-
-
final InputStreamReader in = new InputStreamReader(
-
process.getInputStream());
-
String outline = "";
-
//int flag = process.waitFor();
-
new Thread() {
-
public void run() {
-
BufferedReader bferr = new BufferedReader(err);
-
String errline = "";
-
StringBuilder sberr = new StringBuilder();
-
try {
-
while ((errline = bferr.readLine()) != null) {
-
sberr.append(errline);
-
sberr.append("\n");
-
System.out.println("!!!!!!!!" + errline);
-
}
-
} catch (Exception e) {
-
// TODO Auto-generated catch block
-
e.printStackTrace();
-
}
-
finally{
-
try {
-
err.close();
-
} catch (IOException e) {
-
e.printStackTrace();
-
}
-
}
-
-
}
-
}.start();
-
new Thread() {
-
public void run() {
-
BufferedReader bferr = new BufferedReader(in);
-
String errline = "";
-
StringBuilder sberr = new StringBuilder();
-
try {
-
while ((errline = bferr.readLine()) != null) {
-
sberr.append(errline);
-
sberr.append("\n");
-
System.out.println("**********" + errline);
-
}
-
} catch (Exception e) {
-
// TODO Auto-generated catch block
-
e.printStackTrace();
-
}
-
-
}
-
}.start();
-
-
//process.waitFor();
-
return "";
-
-
}
-
-
public static void main(String[] args) throws InterruptedException {
-
try {
-
RunCMD("java -jar CLI.jar oupload -c config.ini -f userdata.csv");
-
} catch (IOException e) {
-
// TODO Auto-generated catch block
-
e.printStackTrace();
-
}
-
// RunCMD("dir");
-
}
-
-
}
有赖于下面的reference,才能解决问题,不过原文里面说的太不明显了,很容易跳过。
reference: http://blog.csdn.net/ly5156/article/details/7051436
阅读(3977) | 评论(0) | 转发(0) |