Java: Ein externes Programm ausfuehren

Wir verwenden die Klasse "Runtime" aus dem Packet "lang". Mit ihr lassen sich innerhalb von Java-Applikationen andere Programme aufrufen. So können Programme des Betriebssystems verwendet werden.

Externe Programme werden mit der Objektmethode "exec()" der Klasse "Runtime" gestartet. Um ein Objekt vom Typ "Runtime" zu erhalten, muß mit der Singleton-Funktion "getRuntime()" das aktuell verwendete Runtime-Objekt erfragt werden. Für ein Kommando "command" also:

Runtime.getRuntime().exec( command );

Die Methode "exec()" gibt ein Objekt vom Typ Process zurück. Von diesem lassen sich die vom externen Programm verwendetetn So liefert die Funktion "getInputStream()" einen Eingabestrom, der direkt mit dem Ausgabestrom des externen Programms verbunden ist.

Genau das Gleiche gilt für die Funktion "getErrorStream()", welche die Fehlerausgaben des externen Programmes liefert. Durch Schreiben in den Ausgabestrom, den "getOutputStream()" liefert können wir das externe Programm mit Daten füttern, welche dieses auf seiner Standardeingabe lesen kann.

Die folgene Klasse CmdExec benutzt dies alles.

import java.io.*;

public class CmdExec {

  private String out;
  private String err;
  private int exit;

  public CmdExec() {
    out = "";
    err = "";
    exit = 0;
  }

  public String out () { return out; }
  public String err () { return err; }
  public int exit () { return exit; }

  public void exec(String cmd) throws IOException {

    String line;

    Runtime rt = Runtime.getRuntime();
    Process process = rt.exec(cmd);

    try {
      process.waitFor();
    } catch (InterruptedException e) {
    }

    BufferedReader procout = new BufferedReader(
      new InputStreamReader(process.getInputStream())
    );

    while ((line = procout.readLine()) != null) {
      out = out + line + "\n";
    }

    BufferedReader procerr = new BufferedReader(
      new InputStreamReader(process.getErrorStream())
    );
    while ((line = procerr.readLine()) != null) {
      err = err + line + "\n";
    }

    exit = process.exitValue();
  }
}

Ausprobieren kann man diese Klasse mit dem folgenden kleinen Testprogramm:

import java.io.*;

public class Test {

  public Test() {}

  public static void main(String argv[]) {
    CmdExec ce = new CmdExec();
    try {
      ce.exec(argv[0]);
    } catch (Exception e) {
      System.err.println(e.toString());
    }

    System.out.println("stderr " + ce.err());
    System.out.println("stdout " + ce.out());
    System.out.println("retval  " + ce.exit());
  }
}

Alle Touren

Schneebergwege

Raxsteige

Geführte Touren

Perl

Literatur

Musik