1

我正在使用进程构建器执行一个简单的 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);
}
}
4

2 回答 2

2

这是一个将字符串 b 输入到 jar 文件并根据从 jar 文件接收到的输出返回布尔数组列表的代码。

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;
    }
于 2012-08-28T00:46:48.387 回答
0

是我尝试并开始工作的一些示例代码。

该程序使用ProcessBuilder. 它还产生了两个新线程:

  1. 新进程的读取outputerror流并将其写入程序的System.out
  2. 将程序上写入的所有内容复制到新进程System.in的流中input

这很好用,但是我遇到了一些麻烦,无法停止从读取System.in到正常关闭的线程。我找不到中断读取时阻塞的线程的方法System.in,因此我通过将线程设置为守护进程来解决它。

以下是关于这些主题的一些很好的资源:

  1. 中断 Java 线程
  2. 当 Runtime.exec() 不会
于 2012-08-28T07:41:28.363 回答