ProcessBuilder - cmd fuehrt zu Endlosschleife

G

Gwaihirr

Hallo miteinander!
Wenn ich mit einem ProcessBuilder Objekt die Kommandozeile von Windows aufrufen möchte, und den Output (also die ersten Zeilen bis zur Inputabfrage der Kommandozeile) auf System.out ausgeben möchte gerät folgender Code in eine Endlosschleife:

ProcessBuilder pb = new ProcessBuilder("cmd");
Process p = pb.start();
Scanner s = new Scanner(p.getInputStream());
while(s.hasNextLine()) {
System.out.println(s.nextLine());
}

Dabei möchte ich eigentlich ein externes Programm starten, an dieses beliebig viele Commands nacheinander abschicken.
Ich will aber das externe Programm nach dem Abschicken des ersten Befehls weiterhin mit Befehlen füttern, sobald aber eine Eingabeaufforderung des Programms kommt (hier die des cmd) gerät das Lesen des Process-InputStreams in eine Endlosschleife. Wie kann ich das Problem lösen?

Vielen Dank für eure Mühen :)
 
Ich habe das Problem mittlerweile gefunden. Es handelt sich nicht um eine Endlosschleife, sondern die Scanner-Methode hasNextLine() (auch hasNext() ) blockiert (dazu ein Auszug aus der Scanner-API "...Both hasNext and next methods may block waiting for further input."

Kann mir nun jemand eine Möglichkeit nennen, einen Stream Zeile per Zeile abzufragen, ohne dabei eine blockierende Methode zu benutzen?
 
Ich weiß nicht wie gut es sich so verträgt, da es Standartgemäß ja nur eine Konsole gibt, aber schon mal an mehrere Threads gedacht? Wenn eine nicht-blockierende Methode benutzt wird musst du ja selbstständig eine Schleife bauen die die Methode durchrennt, bis das ext. Programm in die Konsole schreibt. (Dauert ja auch ne bestimmte Zeit.) Das würde dann wohl im Endeffekt auf das gleiche rauskommen. Ich weiß nicht ob das möglich ist, aber falls, solltest du einen Outputstream zum Befehle senden nutzen, dann sollte es keine Probleme geben. Falls du dir das zu steuernde Programm selbst schreibst würde ich Allgemein einen Socket und PrintWriter/BufferedReader nutzen.
 
Zuletzt bearbeitet:
Zurück