获得反馈后,我运行程序但在控制台中没有输出
import java.io.File;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.*;
import java.io.InputStream;
class pbdemo {
static public void main(String[] args) throws Exception {
String s;
ProcessBuilder pb = new ProcessBuilder("cmd.exe", "/f", "dir");
pb.directory(new File("C:\\ljava"));
try {
Process pro = pb.start();
pro.waitFor();
BufferedReader br = new BufferedReader(new InputStreamReader(pro.getInputStream()));
while ((s = br.readLine()) != null) {
System.out.println("here we go" + s);
}
} catch (Exception e) {
System.out.println("sorry" + e);
}
}
}
程序运行但没有输出。
答案 0 :(得分:1)
/F
的{{1}}标志用于文件完成。可以安全地假设您希望CMD
标志执行命令。如果没有/C
标记,/C
将以交互方式运行,查找输入,并且您的程序将无限期地阻止cmd.exe
。替换:
waitFor
带
new ProcessBuilder("cmd.exe", "/f", "dir");
答案 1 :(得分:1)
在尝试读取其输出之前,您正在等待该过程完成。但是很有可能它可以完成所有输出的写入,直到你开始阅读它...因为操作系统无法缓冲所有输出。净结果,死锁。
更改代码,以便在您阅读完所有输出后发生pro.waitFor()
调用。
(也有可能将内容写入'错误'流。但除非dir
命令发生严重奇怪的事情,否则它不太可能产生足够的错误输出导致死锁。所以可以忽略任何(假设的)错误输出......就像你现在所做的那样。)
答案 2 :(得分:1)
pro.waitFor();
是一种阻止方法。它将一直等到进程退出之前返回。这样做的问题是,在读取/清除标准输出缓冲区之前,许多程序不会退出,这意味着,在您的情况下,它可能永远不会退出。
尝试这样的事情......
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
public class PBDemo {
public static void main(String[] args) throws Exception {
String s;
ProcessBuilder pb = new ProcessBuilder("cmd.exe", "/c", "dir");
pb.directory(new File("C:\\ljava"));
pb.redirectError();
try {
Process pro = pb.start();
InputConsumer ic = new InputConsumer(pro.getInputStream());
System.out.println("...Waiting");
int exitCode = pro.waitFor();
ic.join();
System.out.println("Process exited with " + exitCode);
} catch (Exception e) {
System.out.println("sorry" + e);
}
}
public static class InputConsumer extends Thread {
private InputStream is;
public InputConsumer(InputStream is) {
this.is = is;
start();
}
@Override
public void run() {
// This is acutally a bad idea, not all process will write a new line ;)
// BufferedReader br = new BufferedReader(new InputStreamReader(pro.getInputStream()));
try {
int in = -1;
while ((in = is.read()) != -1) {
System.out.print((char) in);
}
} catch (IOException exp) {
exp.printStackTrace();
}
}
}
}