我没有得到任何输出,可能机器挂起代码
得到反馈后,我运行程序但在控制台中没有输出
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); } } }
程序运行但没有输出。
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(); } } } }
在尝试读取其输出之前,您正在等待该过程完成。 但是很有可能它可以完成所有输出的写入,直到你开始阅读它…因为操作系统无法缓冲所有输出。 净结果,死锁。
更改代码,以便在读取所有输出后发生pro.waitFor()
调用。
(也有可能将东西写入’错误’流。但是除非dir
命令发生了一些非常奇怪的事情,否则它不太可能产生足够的错误输出来导致死锁。所以它可能没问题只是忽略任何(假设的)错误输出……正如你现在所做的那样。)
CMD
的/F
标志用于文件完成。 假设您希望/C
标志执行命令可能是安全的。 如果没有/C
标志, cmd.exe
将以交互方式运行,查找输入,并且程序将无限期地阻塞在waitFor
。 更换:
new ProcessBuilder("cmd.exe", "/f", "dir");
同
new ProcessBuilder("cmd.exe", "/c", "dir");