# ProcessBuilder Output



## TDO88 (9. Sep 2015)

Hallo Zusammen,

folgendes Problem. Ich rufe aus meiner Java Anwendung ein anderes Programm ".exe" auf.
Das externe Programm führt kurz etwas aus und gibt über die Konsole einen String zurück, ob der Vorgang erfolgreich war oder nicht.
Jetzt möchte ich diesen String abfangen und aus meinem Programm heraus auswerten.
Dazu habe ich folgendes versucht:

```
ProcessBuilder pBuilder = new ProcessBuilder(SwitchBoardPath,LoadINICommand);
File output = new File("C:\\Users\\TDO\\Desktop\\output.txt");
pBuilder.redirectOutput(output);
Process p = pBuilder.start();

BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(p.getInputStream()));

p.waitFor();
                       
StringBuilder response = new StringBuilder();
String line;
while ((line = bufferedReader.readLine()) != null) {
           response.append(line + "\n");
}
bufferedReader.close();
```

Die Methode pBuilder.redirectOutput(output) funktioniert einwandfrei. Der String wird empfangen und in die Datei geschrieben.
Die Variable response bleibt leider leer. 
Wenn der Text in dem Outputfile steht bringt mir das leider nichts. Wie komme ich direkt an den String, bzw. wo ist mein Fehler?

Gruß
TDO


----------



## Joose (9. Sep 2015)

Du initialisierst deinen bufferedReader mit dem InputStream vom Process. Was glaubst du für was der Stream gedacht ist?
Was du nicht machst ist die Datei auslesen? Natürlich sollte es auch möglich sein direkt vom OutputStream des Process zu lesen


----------



## RalleYTN (9. Sep 2015)

Nutz doch redirectOutput() zum umleiten in einen ByteArrayOutputStream. Von dem kannst du die Bytes auslesen und auch zum schreiben verwenden. Wenn du die Bytes in einen String umwandeln willst musst du folgendes tun:

```
String outputString = new String(outputStream.toByteArray());
```
Ich habe keine Ahnung ob das funktioniert, aber ich hätte es so gemacht.


----------



## TDO88 (10. Sep 2015)

Hallo,

zunächst vielen Dank für eure Posts.



Joose hat gesagt.:


> Du initialisierst deinen bufferedReader mit dem InputStream vom Process. Was glaubst du für was der Stream gedacht ist?


Das tue ich, weil es z.B. hier oder hier genauso steht... Hatte mich zunächst auch gewundert, aber die Leute auf den beiden Seiten wollten ja wohl das gleiche wie ich und machen es mit dem InputStream.



Joose hat gesagt.:


> Was du nicht machst ist die Datei auslesen?


Das ist richtig. Ist aber auch absicht! Ich will den Text eigentlich nicht in eine Datei schreiben. Das habe ich nur getestet, um zu sehen, ob meine Anwendung wirklich was schickt. Das ist bisher die einzige Variante, die ich probiert hab, die funktioniert hat.



Joose hat gesagt.:


> Natürlich sollte es auch möglich sein direkt vom OutputStream des Process zu lesen



Eine Idee wie?



RalleYTN hat gesagt.:


> Nutz doch redirectOutput() zum umleiten in einen ByteArrayOutputStream. Von dem kannst du die Bytes auslesen und auch zum schreiben verwenden. Wenn du die Bytes in einen String umwandeln willst musst du folgendes tun:
> 
> ```
> String outputString = new String(outputStream.toByteArray());
> ...



Werde ich gleich mal testen und dann berichten! 

Gruß
TDO


----------



## TDO88 (10. Sep 2015)

Ich bin aber noch sehr dankbar für weitere Tipps oder Hilfe!
Läuft nämlich immernoch nicht


----------



## Joose (10. Sep 2015)

TDO88 hat gesagt.:


> Das tue ich, weil es z.B. hier oder hier genauso steht... Hatte mich zunächst auch gewundert, aber die Leute auf den beiden Seiten wollten ja wohl das gleiche wie ich und machen es mit dem InputStream.



Mein Fehler 
Beim Process sind diese beiden Dinge umgedreht, daher hast du natürlich recht.
Ich habe noch diesen Link dazu gefunden, vielleicht hilft dir dieser weiter: http://stackoverflow.com/questions/8149828/read-the-output-from-java-exec


----------



## TDO88 (10. Sep 2015)

Ich schätze auch mal, dass ich eine Möglichkeit finden muss mit der pBuilder Variable den Output abzufangen und nicht mit der Process Variable "p". Aber für die pBuilder gibt es nur die Möglichkeiten redirectOutput() mit Redirect als Rückgabetyp, redirectOutput(File file) mit ProcessBuilder als Rückgabewert und redirectOutput(Redirect destination) ebenfalls mit ProcessBuilder als Rückgabewert.



Joose hat gesagt.:


> Mein Fehler
> Beim Process sind diese beiden Dinge umgedreht, daher hast du natürlich recht.
> Ich habe noch diesen Link dazu gefunden, vielleicht hilft dir dieser weiter: http://stackoverflow.com/questions/8149828/read-the-output-from-java-exec



Die Seite hatte ich auch schon gesehen. Aber die while Schleife wird ständig sofort beendet, da das aufgerufene Programm nur am Ende einen String rausschickt und nicht die ganze Zeit Daten liefert.

Hat jemand noch eine Idee, wie ich den Redirect auf einen String vom ProcessBuilder nutzen kann?


----------



## TDO88 (10. Sep 2015)

Übrigens: Das externe Programm ist eine C Anwendung, welche über cout den Befehl am Ende schickt, den ich benötige. Weiß nicht, ob das von Interesse ist


----------



## TDO88 (10. Sep 2015)

Macht es einen Unterschied, wenn der String, der vom externen Prozess gesendet wird nicht mit z.B. "\r" abgeschlossen ist?


----------



## Joose (10. Sep 2015)

Das kann schon ein Problem sein ... da du ja mit "nextLine" versuchst zu lesen, solange er aber keine vollständige Zeile hat wird er wahrscheinlich auch nichts lesen können


----------



## TDO88 (10. Sep 2015)

Hab in der externen Anwendung jetzt einmal ein "\n" am Ende der Zeile eingefügt -> immernoch nichts zu lesen und nochmal ein "\r" -> genauso...
Hat sonst noch jemand eine Idee, was ich probieren kann? ich werd hier noch wahnsinnig...


----------



## TDO88 (10. Sep 2015)

Habs jetzt gelöst... Das Problem war der Redirect in die Datei!
Dadurch war der String wohl für den InputStreamReader nicht mehr vorhanden!
=> Zeilen mit dem Redirect auf Datei entfernt und schon gehts


----------



## Joose (10. Sep 2015)

Jetzt wo du es sagst ist es eigentlich logisch. Durch den redirect werden die Daten vom Stream in die Datei geschrieben und sind nicht mehr verfügbar am Stream.
Kleine Details an welche man nicht immer denkt


----------

