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

时间:2013-03-08 03:10:43

标签: java

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

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

程序运行但没有输出。

3 个答案:

答案 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();
            }
        }

    }

}