如何将jar文件输出返回给ProcessBuilder?

时间:2012-05-05 11:02:43

标签: java jar processbuilder

我正在使用流程构建器执行一个简单的jar文件。 jar文件通过要求用户输入数字来简单地计算数字的平方。我可以在控制台输入一个数字,但程序挂起。如何将此(数字)传递回进程构建器,以便由jar文件计算其正方形?

这是我的代码:

public static void executeSystemCommand(String... args) {
try {
    ProcessBuilder pb = new ProcessBuilder(args);

    pb.redirectErrorStream(true);           
    Process proc = pb.start();
    Reader reader = new InputStreamReader(proc.getInputStream());

    int ch;
    while ((ch = reader.read()) != -1) {
        System.out.print((char) ch);    
    }

    reader.close();
    Scanner scan = new Scanner(System.in);

    int k = scan.nextInt();
    proc.getOutputStream().write(k);
    proc.getOutputStream().close();

    while ((ch = reader.read()) != -1) {
        System.out.print((char) ch);    
    }

    reader.close();
} catch (IOException e) {
    e.printStackTrace();
    System.exit(-1);
}
}

2 个答案:

答案 0 :(得分:2)

这是一个代码,它将字符串b输入到jar文件,并根据从jar文件接收的输出返回布尔语的arraylist。

public ArrayList<Boolean> pro(String b) throws IOException, Exception {
        ArrayList<Boolean> ar = new ArrayList<Boolean>();
        try {
            ProcessBuilder pb = new ProcessBuilder("java", "-jar",
                    "myjar.jar");

            pb.directory(new File("path to myjar"));
            Process proc = pb.start();

            Scanner in = new Scanner(proc.getInputStream());
            PrintWriter out = new PrintWriter(proc.getOutputStream());

            // Read user input
            out.println(b);
            out.flush();
            String response = new String();

            // Read the response
            for (int i = 0; i < b.length(); i++)
                response = in.nextLine();

            in.close();
            out.close();

            StringTokenizer st = new StringTokenizer(response);
            while (st.hasMoreTokens()) {
                String bol = st.nextToken();

                if (bol.equals("true"))
                    ar.add(true);
                else
                    ar.add(false);

            }

        } catch (IOException e) {
            e.printStackTrace();
        }
        return ar;
    }

答案 1 :(得分:0)

Here是我尝试过的一些示例代码。

该程序使用ProcessBuilder启动外部流程。它还产生了两个新线程:

  1. 阅读output&amp;新进程的error个流并将其写入程序的System.out
  2. 将程序System.in上写的所有内容复制到新流程的input流中
  3. 这很好用,但是我遇到了一些麻烦,让你停止从System.in读取的线程正常关闭。我无法找到一种方法来中断从System.in读取时阻塞的线程,所以我通过将线程设置为守护进程来解决它。

    以下是关于这些主题的几个好资源:

    1. Interrupting Java threads
    2. When Runtime.exec() won't