1

プロセス ビルダーを使用して単純な jar ファイルを実行しています。jar ファイルは、ユーザーに数値の入力を求めることで、単純に数値の 2 乗を計算します。コンソールで数値を入力できますが、プログラムがハングします。この (数値) をプロセスビルダーに戻して、その二乗を 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ます。また、次の目的で 2 つの新しいスレッドを生成します。

  1. 新しいプロセスの読み取りoutputerrorストリームを実行し、プログラムのSystem.out
  2. System.inプログラムに書かれたすべてを新しいプロセスのinputストリームにコピーします

これはうまくいきますが、読み取りからSystem.in正常にシャットダウンするスレッドを停止するのに問題が発生しました。からの読み取りでブロックされたスレッドを中断する方法が見つからなかったためSystem.in、スレッドをデーモンとして設定することで回避しました。

これらのトピックに関するいくつかの優れたリソースを次に示します。

  1. Java スレッドの中断
  2. Runtime.exec() が実行されない場合
于 2012-08-28T07:41:28.363 に答える