Start externer Programme

Onkel Tom

Mitglied
Hallo Forum,

habe den Text im Internet gefunden und will es nachnutzen.

Java:
import java.util.*;
import java.io.*;
class StreamGobbler extends Thread
{
    InputStream is;
    String type;
    StreamGobbler(InputStream is, String type)
    {
        this.is = is;
        this.type = type;
    }
   
    public void run()
    {
        try
        {
            InputStreamReader isr = new InputStreamReader(is);
            BufferedReader br = new BufferedReader(isr);
            String line=null;
            while ( (line = br.readLine()) != null)
                System.out.println(type + ">" + line);  
            } catch (IOException ioe)
              {
                ioe.printStackTrace();
              }
    }
}

public class GoodWindowsExec
{
    public static void main(String[] args)
    {
        try
        {          
            String osName = System.getProperty("os.name" );
            String[] cmd = new String[4];
            if( osName.equals( "Windows 10" ) )
            {
                cmd[0] = "cmd.exe" ;
                cmd[1] = "/C" ;
                cmd[2] = "java";
                cmd[3] = "-version";
            }
           
            Runtime rt = Runtime.getRuntime();
            System.out.println("Execing " + cmd[0] + " " + cmd[1] + " " + cmd[2]+" "+cmd[3]);
            Process proc = rt.exec(cmd);
            // any error message?
            StreamGobbler errorGobbler = new StreamGobbler(proc.getErrorStream(), "ERROR");          
           
            // any output?
            StreamGobbler outputGobbler = new StreamGobbler(proc.getInputStream(), "OUTPUT");
               
            // kick them off
            errorGobbler.start();
            outputGobbler.start();
                                   
            // any error???
            int exitVal = proc.waitFor();
            System.out.println("ExitValue: " + exitVal);      
        } catch (Throwable t)
          {
            t.printStackTrace();
          }
    }
}

das Programm läuft, Aufruf mit 'java GoodWindowsExec java -version'
Allerdings zeigt es die ERROR - Meldung an. Warum ? der Exitwert ist auch 0.
Außerdem möchte ich die Ausgabe in eine Variable geschrieben haben. Die brauche ich an anderer Stelle in meinem Programm.

Gruß,
Onkel Tom
 
Wenn Du eine Applikation startest, dann gibt es zwei Standard Ausgaben: Die "normale" Ausgabe (stdout) und die Fehler Ausgabe (stderr). (Findest Du in Java in Deinem Program halt einmal in System.out und in System.err.)

java -version gibt die Hinweise zur Version über stderr aus.

Dies kannst Du über die Umleitung auch sehen. Wenn Du in der Eingabeaufforderung bist, dann kannst Du stdout und stderr umleiten. stdout leitest du über > um und stderr über 2> um.

Also kannst Du z.B. java -version > stdout.txt 2> stderr.txt aufrufen um dann in den Dateien zu sehen, was wohin geschrieben wurde.

Edit: Ganz vergessen: Das sieht man dann natürlich auch am Prozess: getErrorStream gibt halt den stream von stderr des Prozesses und getInputStream den stream von stdout. (Was halt bei dem Prozess Output ist, ist für uns Input. Davon bitte nicht verwirren lassen!)

Und wenn Du die Ausgabe weiter verwenden willst, dann könntest Du die gelesenen Zeilen ja noch weiter verwenden. Sprich in der while Schleife könntest Du die Variable line noch weiter verwenden und diese irgendwo merken. Wird halt nur etwas komplexer, weil Du mit mehreren Threads arbeitest und Du da aufpassen musst, dass Du nicht dadurch in Probleme rennst. Beide Threads könnten ja gleichzeitig versuchen, einen Wert zu ändern oder so...
 
Zuletzt bearbeitet von einem Moderator:

Neue Themen


Zurück
Oben