2016-06-01 20 views
0

Ich versuche, Befehle auf dem Terminal auszuführen. mitLesen von BufferedReader

 ProcessBuilder builder = new ProcessBuilder("/bin/bash"); 
     builder.redirectErrorStream(true); 
     Process process = builder.start(); 
     OutputStream stdin = process.getOutputStream(); 
     InputStream stdout = process.getInputStream(); 

     reader = new BufferedReader(new InputStreamReader(stdout)); 
     writer = new BufferedWriter(new OutputStreamWriter(stdin)); 

Ich werde diesen Leser und und Schriftsteller verwenden, um ständig mit dem Prozess zu kommunizieren.

ich die folgende Schleife

 while ((line = reader.readLine()) != null) { 
     System.out.println("line); 
     } 

AUSGABE zu lesen: Das Problem hier ist, dass, wenn der Leser beginnt aus dem Puffer liest seinen für immer in der while-Schleife. Es wird nie beendet.

Ich habe versucht, das Lesen in einem Thread habe ich

public void run() { 
     try { 
      String line; 
      outputText = ""; 
      while ((line = reader.readLine()) != null) { 
       System.out.println(line); 
      } 
     } catch (IOException ex) { 
      Logger.getLogger(ThreadReader.class.getName()).log(Level.SEVERE, null, ex); 
     } 
    } 

Aber jetzt, wenn der Leser beginnt keine Kontrolle zu bringen und beendet hat.

ZIEL: Ich muss einen Befehl ausführen und lesen Sie die Ausgabe und dann den nächsten Befehl.

+0

Warum haben Sie keine Kontrolle darüber, wann der Leser startet? Das ist, wenn Sie den Thread richtig starten? (Oder plane es vorzugsweise in einem Thread-Pool). Und Ihr Leser stoppt, wenn der Prozess seine Ausgabe-/Fehlerströme beendet oder schließt. Wenn der Prozess das nicht macht, hört der Leser nicht auf. –

+0

Versuchen Sie, ein Ende des Stream-Tokens zu verwenden, um dem Leser mitzuteilen, wann er fertig sein muss (oder eine Pause machen muss). Andernfalls würde es unbegrenzt auf eine neue Eingabe warten, da es nicht weiß, dass der andere Prozess in den Stream geschrieben wird. – Thomas

+0

"Ich muss einen Befehl ausführen und den Ausgang lesen ..." Erklären Sie, was "den Ausgang lesen" eigentlich bedeutet. Lesen Sie eine Zeile der Ausgabe? Fünf Zeilen lesen? Lesen Sie alle verbleibenden Ausgaben? – VGR

Antwort

1

Ihr Java-Programm kommuniziert mit einem externen interaktiven Prozess. Es hat nur die Ausgabe- und Fehlerströme des Prozesses zur Verfügung, um zu bestimmen, wie von einem gegebenen Punkt aus verfahren werden soll. Wenn Sie wollen, dass Unterteilungen der Ausgabe erkannt werden, z. B. Antworten auf einzelne Befehle, dann müssen Sie ihnen beibringen, wie die Grenzen dieser Unterteilungen aussehen.

Es gibt viele Möglichkeiten, wie Sie das Problem angehen können. Wenn zum Beispiel das externe Programm eine Aufforderung ausgibt, wenn es bereit ist, einen neuen Befehl anzunehmen, dann ist es naheliegend, auf diese Aufforderung zu achten. Alternativ können Sie die Eingabe möglicherweise an das Programm anpassen, um am Ende der Ausgabe jedes Befehls einen erkennbaren Marker zu erzeugen.

Denken Sie auch, dass dies ein gelöstes Problem ist (viele Male vorbei). Das kanonische Dienstprogramm für das allgemeine Scripting interaktiver Programme ist ein Tcl-Programm namens "Expect". Es hat Arbeitsalike in vielen Sprachen inspiriert, darunter viele in Java. Google gibt mir drei verschiedene Beispiele unter den ersten fünf Treffern, aber ich habe keine spezifische Erfahrung mit ihnen, also mache ich keine Empfehlung.

Verwandte Themen