2016-05-10 13 views
0

こんにちは、C++プログラム用のJava GUIをビルドしています。私はちょっと、exeファイルを呼び出すProcessBuilderに固執しています。Java ProcessBuilder EXEファイルが正しく入力ストリームを取得しない

私はちょうどこのProcessBuilderをする事をテストし、私はI/Oストリームを制御できるかどうかを確認するためにC++で、この小さなプログラムを作った次のように

#include <cstdlib> 
#include<stdio.h> 

int main(int argc, char** argv) { 
    int testInteger; 
    int a = 1; 
    while (a==1){ 
     printf("Enter an integer: "); 
     scanf("%d",&testInteger); 
     if (testInteger == 0){ 
      printf("Quitting program!"); 
      return 0; 
     }else{ 
      printf("You entered the number = %d\n",testInteger); 
     }   
    } 
    return 0;  
} 

私のJavaコードは次のとおりです。

public static void main(String[] args) throws InterruptedException, IOException{ 


     ProcessBuilder pb = new ProcessBuilder("./i_o_test");   
     Process process = pb.start(); 

     InputStream is = process.getInputStream(); 
     InputStreamReader isr = new InputStreamReader(is); 
     BufferedReader br = new BufferedReader(isr); 
     String line; 
     while ((line=br.readLine()) != null){ 

      System.out.println(line); 
     } 

    } 

コードはエラーを表示せず、whileループでハングします。それは何も印刷しません。 このコードは "echo"のようなコマンドでうまく動作するので、ここで何が間違っているのか分かりません。

事前に

おかげで、 Maarc〜

答えて

0
(君たちはProcessBuilderを以外のJavaからC++ exeファイルのプロセスのI/Oストリームの制御を取るためのより良い提案、すべての耳をイムを持っている場合)

BufferedReader#readLine()は、改行文字を受け取ることによって示される完全な行が利用可能になるまでブロックします。

あなたのC++コードは、改行なしでプロンプトを表示します。この結果、readLine()が返されず、結果として表示される動作になります。 JavaとC++のコードをやりとりしたい場合は、メッセージが完成し、実行準備ができたときに通信するための "プロトコル"を定義する必要があります。これは、改行と同じくらい単純なものでも、必要に応じてもっと複雑なものでもかまいません。それは本当にあなた次第ですが、既存のC++プログラムを扱い、Javaから制御したい場合は、それに対処する準備が必要です。

たとえば、C++プログラムで改行なしでプロンプトが表示され、その代わりにプロンプ​​ト文字列の末尾にコロン:がなければならない可能性があります。これは、JavaコードがreadLine()を使用できず、一度に1文字ずつ処理する必要があることを意味します。

+0

私はそれぞれのprintfの最後に "\ n"を追加しようとしましたが、それでも動作しません。whileループにはまっています。これは、改行を促すことでどういう意味ですか? –

関連する問題