从java代码获取cmd命令的输出

时间:2013-12-27 15:58:50

标签: java windows cmd exec runtime.exec

我有一个程序,我可以从我的代码中成功执行cmd命令,但我希望能够从cmd命令获取输出。我怎么能这样做?

到目前为止,我的代码是:

Second.java:

public class Second {
    public static void main(String[] args) {
        System.out.println("Hello world from Second.java");
    }
}

和Main.java

public class Main {
    public static void main(String[] args) {
        String filename = args[1].substring(0, args[1].length() - 5);
        String cmd1 = "javac " + args[1];
        String cmd2 = "java " + filename;

        Runtime r = Runtime.getRuntime();
        Process p = r.exec(cmd1); // i can verify this by being able to see Second.class and running it successfully
        p = r.exec(cmd2); // i need to see this output to see if 

        System.out.println("Done");
    }
}

我可以通过检查Second.class来检查第一个命令是否成功,但是如果这个类产生了一些错误,我怎么能看到那个错误呢?

3 个答案:

答案 0 :(得分:8)

你需要你的Process的OutputStream(InputStream)(你应该使用ProcessBuilder)......就像这样

public static void main(String[] args) {
  String filename = args[1].substring(0, args[1].length() - 5);
  String cmd1 = "javac " + args[1];
  String cmd2 = "java " + filename;

  try {
    // Use a ProcessBuilder
    ProcessBuilder pb = new ProcessBuilder(cmd1);

    Process p = pb.start();
    InputStream is = p.getInputStream();
    BufferedReader br = new BufferedReader(new InputStreamReader(is));
    String line = null;
    while ((line = br.readLine()) != null) {
      System.out.println(line);
    }
    int r = p.waitFor(); // Let the process finish.
    if (r == 0) { // No error
       // run cmd2.
    }
  } catch (Exception e) {
    e.printStackTrace();
  }
}

答案 1 :(得分:4)

从命令返回的一般示例是:

 Process p = null;
    try {
        p = p = r.exec(cmd2);
        p.getOutputStream().close(); // close stdin of child

        InputStream processStdOutput = p.getInputStream();
        Reader r = new InputStreamReader(processStdOutput);
        BufferedReader br = new BufferedReader(r);
        String line;
        while ((line = br.readLine()) != null) {
             //System.out.println(line); // the output is here
        }

        p.waitFor();
    }
    catch (InterruptedException e) {
            ... 
    }
    catch (IOException e){
            ...
    }
    finally{
        if (p != null)
            p.destroy();
    }

答案 2 :(得分:1)

看这里:Extracting a process's exit code in the case of ThreadInterrupted

你需要获得返回代码......你必须等待它。