privateBufferedReaderrunCommand(Runtime r,File cmd,String[] params,File workingdir)throwsIOException{String[] cmdarray =newString[1+ params.length];
cmdarray[0]= cmd.getAbsolutePath();for(int i =0; i < params.length; i++){
cmdarray[i+1]= params[i];}/*
System.out.println("STARTE PROZESS: ");
for (String s : cmdarray) {
System.out.println(s);
}
*/Process p = r.exec(cmdarray,null, workingdir);BufferedReader stdin =newBufferedReader(newInputStreamReader(p.getInputStream()));BufferedReader stderr =newBufferedReader(newInputStreamReader(p.getErrorStream()));try{
p.waitFor();}catch(InterruptedException e){
e.printStackTrace();}return stdin;}
Jetzt möchte ich folgendes erreichen:
Wenn Fehler, dann stderr zurückgeben; sonst stdin zurückgeben.
Wie mach ich das?!
Außerdem verstehe ich nicht ganz, warum der Output des externen Commands ein InputStream ist (hab ich so im Netz gefunden und es funktioniert; ich hätte mir den Output aber eher in stdout erwartet -> ???:L)
ohne die Ausgaben zu lesen kannst du nicht erkennen, was die Ausgaben sind,
es sei denn du hast über Sockets, angeschlossene USB-Messgeräte oder sonst etwas exotisches näheren Einblick
vielleicht gibts du einen neuen BufferedReader zurück, der aus beiden liest, irgendwas basteln
-----
mit dem Streams muss du dir das so denken:
der andere Prozess schreibt seine Ausgaben in einen Outputstream, so wie System.out.println(),
du willst sie aber nun einlesen, das geht ja auch nur mit einem InputStream, ähnlich System.in
Hallo SlaterB.
danke für deine Antwort.
Deine untenstehende Erklärung ist sehr einleuchtend.
Das würde dann theoretisch bedeuten, ich könnte (unter Windows) einen Prozess cmd.exe starten und dann weitere Prozesse über den OutputStream starten, oder (was ja keinen Sinn macht, aber möglich müsste es sein ...)
Was meinen BufferedReader betrifft:
Grundsätzlich wird doch nur ENTWEDER der InputStream ODER der ErrorStream Inhalt haben, oder?!
Kann ich nicht irgendwie feststellen, ob mein Prozess einen dieser beiden Streams "beschrieben" hat?!
mfg, guni
PS.: was meinst du mit basteln? Geht das vom Ansatz in Richtung Thread/PipedStream der StdErr und StdIn liest? Oder gibt es da eine unkompliziertere Möglichkeit?!
basteln in Richtung des neu gebastelten Streams aus dem Thread XML-Transformation mit Fortschrittsanzeige,
also eine eigene Klasse, die die anderen Streams intern enthält, bei einem read() auf beide internen read() ausführt und das zurückgibt was da ist,
aber vielleicht reicht auch nur die available()-Methode um das zu prüfen und dann einen Stream zurückzugeben,
hatte ich vorhin vergessen, ob die auch immer richtig funktioniert?..
> Grundsätzlich wird doch nur ENTWEDER der InputStream ODER der ErrorStream Inhalt haben, oder?!
nicht unbedingt, kommt darauf an wer da was sendet,
schonmal in Eclipse ein Programm mit einer normalen Ausgabe und dann einer Exception in roter Schrift gesehen?
viele Programme halten sich sicher an eine Trennung, muss aber nicht sein