2012-03-14 3 views
1

コンソールでTest.exeからのメッセージを出力するアプリケーションが1つあります.My javaプログラムはこのTest.exeを実行して1つのプロセスを作成します。 このアプリケーションは、そのプロセスのinput-streamからメッセージを読み取って出力します。私はTEST.EXEをダブルクリックすると
1)、メッセージ(:私は直面していますことをJavaプログラムの.exe printf()メッセージを出力するには

問題、
私は2つのシナリオを持っている「印刷:%dは」)毎秒のために印刷されています。
2)しかし、Javaアプリケーションを実行すると、Test.exeを終了する前に、メッセージが最後に(1秒ごとではなく)印刷されています。
.exeに非常に膨大なメッセージが印刷されている場合は、それらのメッセージが印刷されます(バッファがいっぱいになると思っています)、フラッシングが行われます。
しかし、どのようにして1番目のケースと同じメッセージを印刷できますか。

誰もが助けていただければ幸いです。 :)

このTest.exeのコードは次のとおりです。

#include <stdio.h> 
#include <windows.h> 
void main(void) 
{ 
    int i=0; 

    while (1) 
    { 
    Sleep(500); 
    printf("\nPrinting : %d",i); 
    i++; 
     if (i==10) 
     //if(i==100) 
     { 
     return 0; 
     } 
    } 
} 

そして、私のJavaアプリケーションは以下の通りです:

public class MainClass { 
public static void main(String[] args) { 

    String str = "G:\\Charan\\Test\\Debug\\Test.exe"; 
    try { 
     Process testProcess = Runtime.getRuntime().exec(str); 

     InputStream inputStream = new BufferedInputStream(
       testProcess.getInputStream()); 
     int read = 0; 
     byte[] bytes = new byte[1000]; 
     String text; 
     while (read >= 0) { 
      if (inputStream.available() > 0) { 
       read = inputStream.read(bytes); 
       if (read > 0) { 
        text = new String(bytes, 0, read); 
        System.out.println(text); 
       } 
      } 
     } 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 
} 

は、Javaが読むべきと.exeためにその文字列を渡す(またはtestProcess)逆order.IfのI入力で可能コンソールからいくつかのテキスト、それをです.exe.exeは、Javaプログラムから何かをスキャンします。

誰も私を助けてもらえ..

+1

それぞれのprintfの後に 'fflush(stdout)'を追加してみてください –

答えて

0

をフラッシュしていないとは何かを持っているようです。私はそれが両側にあると思う - あなたが使用するCライブラリは、端末に書き込むときに自動的に出力をフラッシュするようだ。 printfを呼び出した後、手動でフラッシュします。

Java側では、バッファされていないストリームから読み込みます。

+0

返事ありがとうございました。私はそれをチェックします... – CharanTej

+0

ありがとうございました。 – CharanTej

+0

再び中断して申し訳ありません.. 私は毎回フラッシュするので、私たちのアプリケーションでパフォーマンスの問題が発生します。私は、私たちの.exeがメッセージを頻繁に出力することを認識したので、毎回フラッシュするとパフォーマンスの問題が発生する可能性があります。 – CharanTej

1

行ごとにそのプロセスからstdoutを印刷しようとすると、プロセスの入力ストリームを使用してBufferedReaderオブジェクトを作成し、それに対してreadLine()メソッドを使用します。あなたは、コンストラクタの以下のチェーン使用してBufferedReaderのオブジェクトを取得することができます

BufferedReader testProcessReader = new BufferedReader(new InputStreamReader(testProcess.getInputStream())); 

をそして行ずつ読むために:ここでの仮定はTEST.EXEが必要とされ、その出力を、フラッシュしていることである

String line; 
while ((line = testProcessReader.readLine()) != null) { 
    System.out.println(line); 
} 

Java側からの読み込みによって。 printf()を呼び出すたびにfflush(stdout)を呼び出すと、Cからの出力をフラッシュできます。

フラッシュしないと、データはバッファ内にのみ存在します。パフォーマンスを考慮すると、データを書き込む頻度と保存する書き込み/フラッシュ操作の回数とのトレードオフがあります。パフォーマンスが重要な場合は、stdoutではなくプロセス間でデータを渡す、より効率的なプロセス間通信メカニズムを検討することを検討できます。あなたがWindows上にいるので、最初のステップはMicrosoft IPC help pageを見ることです。

+0

BufferedReaderに移動しても変更はありません。とにかくありがとうございます...私はflush()で確認します – CharanTej

+0

ありがとうございました。 fflush(stdout)working now .. :) – CharanTej

+0

私の.exeは非常に頻繁にメッセージを表示します。そのたびにフラッシュするとパフォーマンスの問題が発生する可能性があります。 – CharanTej

関連する問題