2017-07-12 7 views
0

私は、JAVAプログラムでEXEファイルを実行します。Java ProcessBuilder - すぐに出力を取得する

それはうまく動作しますが、私はすぐに私のJAVAプログラムのtextAreaでEXEの出力をします。

現在、「ping」コマンドが完全に終了した後に出力が表示されます(したがって、JAVAプログラムは約3秒間ハングします)。しかし、私はすぐに結果を持ってほしい...

私は間違っていますか?後方

ProcessBuilder pb = new ProcessBuilder().command("C:\\Windows\\SysWOW64\\PING.EXE", "127.0.0.1"); 
    pb.redirectErrorStream(true); 

    Process process = pb.start(); 

    InputStream processStdOutput = process.getInputStream(); 
    Reader r = new InputStreamReader(processStdOutput); 
    BufferedReader br = new BufferedReader(r); 
    String line; 
    while ((line = br.readLine()) != null) { 
//  System.out.println(line); // the output is here 
     textArea.append(line); 
    } 

コマンドー。

さて私はこのプログラムを使用したい:iperfのは、実行された後にまだ私はこれだけの完全な出力を得る

Connecting to host 10.1.100.34, port 5201 
[ 4] local 172.16.12.33 port 63802 connected to 10.1.100.34 port 5201 
[ ID] Interval   Transfer  Bandwidth 
[ 4] 0.00-1.00 sec 112 MBytes 944 Mbits/sec     
[ 4] 1.00-2.00 sec 112 MBytes 944 Mbits/sec     
[ 4] 2.00-3.00 sec 112 MBytes 944 Mbits/sec     
[ 4] 3.00-4.00 sec 112 MBytes 940 Mbits/sec     
[ 4] 4.00-5.00 sec 112 MBytes 944 Mbits/sec     
[ 4] 5.00-6.00 sec 112 MBytes 944 Mbits/sec     
[ 4] 6.00-7.00 sec 112 MBytes 940 Mbits/sec     
[ 4] 7.00-8.00 sec 112 MBytes 944 Mbits/sec     
[ 4] 8.00-9.00 sec 112 MBytes 940 Mbits/sec     
[ 4] 9.00-10.00 sec 112 MBytes 944 Mbits/sec     
- - - - - - - - - - - - - - - - - - - - - - - - - 
[ ID] Interval   Transfer  Bandwidth 
[ 4] 0.00-10.00 sec 1.10 GBytes 942 Mbits/sec     sender 
[ 4] 0.00-10.00 sec 1.10 GBytes 942 Mbits/sec     receiver 

iperf Done. 

https://iperf.fr/iperf-download.php

出力は次のようになります。私はデバッグする場合、私は行を(行ごとに)取得します。だから別の問題があるかもしれません...

+0

おそらく 'BufferedReader'のバッファが原因でバッファリングされていますか? –

+0

これに 'BufferedReader'を使わないで、' Reader r'から直接読み込もうとします – Antoniossss

+0

また、それは何を意味するのですか?ウィンドウが空白のテキストエリアでポップアップし、3秒後にテキストが表示されることを意味しますか?あなたはその権利のためにスレッドを使用しなければならないことを知っていますか? – Antoniossss

答えて

1

実際には、私はあなたの例を試して、すぐにストリームを出力しますが、私はそれのためのテキスト領域を使用していないコンソール出力。 コードはどのくらい正確に呼び出されていますか?おそらく、それはGUIの再描画マネージャーに関連しています - それはEDTから呼び出されますか?そうでない場合、遅延の原因となる可能性があります。

このような何かしてください:あなたは、このために専用のユーティリティを使用する必要がありますが、バックグラウンドタスクを使用している(しかし、あなたがそれを認識していない)のよう

SwingUtilities.invokeLater(new Runnable() { 
     @Override 
     public void run() { 
      area.append(line); 
     } 
    }); 

SwingWorkerhttps://docs.oracle.com/javase/7/docs/api/javax/swing/SwingWorker.htmlと呼ばれます。ここでのボーナスは完全な例であり、自分で実行することができます。スイングワーカーを使ってバックグラウンドジョブを実行し、EDTでGUIを更新します

public class LetsPing { 

public static void main(String[] args) { 
    JFrame frame = new JFrame(); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.setLayout(new BorderLayout()); 
    frame.setSize(300, 300); 
    frame.setLocationRelativeTo(null); 

    JTextArea textArea = new JTextArea(); 
    frame.add(textArea, BorderLayout.CENTER); 
    frame.setVisible(true); 

    new SwingWorker<Void, String>() { 
     @Override 
     protected Void doInBackground() throws Exception { 
      ProcessBuilder pb = new ProcessBuilder().command("C:\\Windows\\SysWOW64\\PING.EXE", "127.0.0.1"); 
      pb.redirectErrorStream(true); 
      Process process; 
      process = pb.start(); 
      InputStream processStdOutput = process.getInputStream(); 
      Reader r = new InputStreamReader(processStdOutput); 
      BufferedReader br = new BufferedReader(r); 
      String line; 
      while ((line = br.readLine()) != null) { 
       publish(line); 
      } 
      return null; 
     } 

     @Override 
     protected void process(List<String> chunks) { 
      for (String line : chunks) { 
       textArea.append(line); 
       textArea.append("\n"); 
      } 
     } 
    }.execute(); 
} 
} 
+0

あなたのコードに感謝します。 pingコマンドでうまく動作します。しかし、私が "iperf3.exe -c 10.15.100.34"のような別のコマンドを使用すると、前と同じ動作になります。私は、コマンドが完了した後、完全な出力を得るだけです。 (約4-5秒)。 – Timo

+0

@Timo idk 'iperf3'の通常の出力とは何ですか?ここで助けてください。おそらく、新しい行などに異なる文字セットを使用しています。普通のリーダーを使用して開始します。 – Antoniossss

+0

Ofcはreadが文字コードを返すためです。しかし、少なくともここでバッファリングが問題であることを知っています。読んで苦痛であるので、コメントにコードを渡してはいけません。あなたは質問や何かを編集することができます。 – Antoniossss

関連する問題