在Java中,用ProcessBuilder创建一个Process,向cmd输入命令,拿到正常输出和error,方法如下:
String cmds = ...;
ProcessBuilder builder = new ProcessBuilder("cmd");
ProcessBuilder builder = new ProcessBuilder("cmd");
builder.redirectErrorStream(true); //将error和正常输出都转换到输出,用getInputStream都可以得到
Process process = builder.start();
BufferedWriter pStdin = new BufferedWriter(new OutputStreamWriter(p.getOutputStream()));
pStdin.write(cmd);
pStdin.newLine();
pStdin.flush();
pStdin.write(cmd);
pStdin.newLine();
pStdin.flush();
process.getOutputStream().close(); // 关掉输入流
BufferedReader br = new BufferedReader(new InputStreamReader(process.getInputStream()));
String readLine = br.readLine();
while (readLine != null) {
System.out.println(readLine); //既有正常输出和error message。
readLine = br.readLine();
}
BufferedReader br = new BufferedReader(new InputStreamReader(process.getInputStream()));
String readLine = br.readLine();
while (readLine != null) {
System.out.println(readLine); //既有正常输出和error message。
readLine = br.readLine();
}
如果去掉第二行标红的代码,执行时会报错,原因可能是process一直等待outputStream输入。
如果不加第一行标红代码,同事使用process.waitfor,也可能报错,原因可能是getErrorStream流和getInputStream流相互阻塞,所以最好将他们合并。