2017-07-12 2 views
0

Ich möchte eine EXE-Datei in einem JAVA-Programm ausführen.Java ProcessBuilder - Ausgabe sofort erhalten

Es funktioniert gut, aber ich möchte die Ausgabe der EXE sofort in einem textArea meines JAVA-Programms.

Momentan bekomme ich die Ausgabe, nachdem der "ping" -Command vollständig beendet wurde (so dass das JAVA-Programm für ca. 3 Sekunden hängen bleibt). Aber ich möchte das Ergebnis sofort haben ...

Was mache ich falsch?

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); 
    } 

rückwärts Kommando.

Nun möchte ich dieses Programm verwenden: https://iperf.fr/iperf-download.php

Ausgabe wie folgt aussieht:

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. 

Noch bekomme ich nur das komplette Ausgabe nach iperf ausgeführt wurde. Wenn ich debugge, bekomme ich die Zeilen (Zeile für Zeile). Also könnte es ein anderes Problem geben ...

+0

vielleicht der Puffer in 'BufferedReader' verursacht es gepuffert werden? –

+0

Verwenden Sie 'BufferedReader' nicht dafür, versuchen Sie direkt von' Reader r' zu lesen – Antoniossss

+0

Auch was bedeutet es, dass es hängt? Du meinst, dass das Fenster mit leerem Textbereich auftaucht und nach 3 Sekunden zeigt Text hinein? Du weißt, dass du Threads für dieses Recht verwenden musst? – Antoniossss

Antwort

1

Um ehrlich zu sein, habe ich versucht, Ihr Beispiel und es gibt Strom sofort, aber ich habe nicht Textbereich dafür verwendet, aber Konsole ausgegeben. Wie genau wird Ihr Code aufgerufen? Vielleicht ist es mit GUI Repaint Manager verwandt - Wird es von EDT aufgerufen? Wenn nicht, kann dies die Verzögerung verursachen.

Versuchen Sie, so etwas zu tun:

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

Wie Sie verwenden Hintergrundaufgabe (aber Sie sind sich nicht bewusst, dass) Sie dedizierte Dienstprogramm sollte für diese SwingWorkerhttps://docs.oracle.com/javase/7/docs/api/javax/swing/SwingWorker.html genannt. Als Bonus hier ist ein vollständiges Beispiel, das Sie selbst ausführen können. Es nutzt Swing Arbeiter einen Hintergrund-Job und Updates GUI auf EDT zu tun

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

danke für Ihren Code. Es funktioniert gut mit dem Ping-Befehl. Aber wenn ich einen anderen Befehl wie "iperf3.exe -c 10.15.100.34" verwende, habe ich das gleiche Verhalten wie zuvor. Ich bekomme nur die komplette Ausgabe, nachdem der Befehl beendet ist. (ungefähr 4-5 Sekunden). – Timo

+0

@Timo idk was ist die normale Ausgabe von 'iperf3' also keine Hilfe hier. Vielleicht benutzt es einen anderen Zeichensatz für neue Zeilen usw. Beginnen Sie damit, einfache Leser zu verwenden, die gepufferte enthalten. – Antoniossss

+0

Ofc weil gelesenen Zeichencode zurückgibt. Aber zumindest weißt du jetzt, dass das Puffern das Problem war. Übergeben Sie den Code nicht in Kommentare, da es mühsam ist, sie zu lesen. Sie können die Frage oder etwas bearbeiten. – Antoniossss

Verwandte Themen