0

Javaアプリケーションからjava.jar(ダブルクリックで動作しています)を呼び出そうとしています.そして、以下のコードで動作しています.主な問題は、呼び出されたjarが動作し始めるとき(GUIアプリケーション)、私のメイン(別のGUIアプリケーション)アプリケーションを使用できません.execコマンドの終了を待っていると思います。この 2 つのアプリケーションを適切に実行するにはどうすればよいですか?

  public void handle(Event arg0) {

            Runtime runTime = Runtime.getRuntime();
            try {
                Process process = runTime
                        .exec("java -jar \"D:\\WORKSPACE\\Deploy\\Binary\\XXXX.jar\"");
                BufferedInputStream inputStream = new BufferedInputStream(process.getInputStream());
                BufferedInputStream errorStream = new BufferedInputStream(process.getErrorStream());

                int n1;
                byte[] c1 = new byte[4096];
                StringBuffer standardOutput = new StringBuffer();
                while ((inputStream.read(c1) != -1)) {

                    standardOutput.append(c1.toString());
                }
                System.out.println("Standard Output: " + standardOutput.toString());

                int n2;
                byte[] c2 = new byte[4096];
                StringBuffer standardError = new StringBuffer();
                while (errorStream.read(c2) != -1) {
                    standardError.append(c2.toString());
                }
                System.out.println("Standard Error: " + standardError.toString());

            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    });
4

1 に答える 1

1

問題は、ストリームを消費するコードにあります...

while ((inputStream.read(c1) != -1)) {
    standardOutput.append(c1.toString());
}
System.out.println("Standard Output: " + standardOutput.toString());

int n2;
byte[] c2 = new byte[4096];
StringBuffer standardError = new StringBuffer();
while (errorStream.read(c2) != -1) {
    standardError.append(c2.toString());
}

いずれかのストリームから読み取ろうとしている間、おそらくイベント ディスパッチ スレッドである呼び出しスレッドをブロックします。

必要なものは2つです。

  1. Threadプロセスの実行を処理するためのAと
  2. Threadストリームの読み取りを処理するA

たとえば、プロセスからの Java InputStream の印刷

ProcessBuilderまた、プロセスに渡したい引数ごとに別々の文字列を使用することをお勧めします (スペースを使用する引数の処理が大幅に簡単になります)の使用を強くお勧めします。また、エラーをリダイレクトすることもできます。にストリングを挿入すると、InputStream管理がさらに簡単になります...

于 2013-09-30T07:41:30.260 に答える