我没有得到任何输出,可能机器挂起代码

得到反馈后,我运行程序但在控制台中没有输出

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");