Start - Publikationen - Wissen - TOGAF - Impressum -

Aufrufe an das Betriebssystem aus Java heraus sind eigentlich ganz leicht. Zumindest solange man keine Ausgaben als Antwort verarbeiten will. Sobald das der Fall ist, muss man "sauber" auf die Abarbeitung des OS-Calls warten. In Pseudocode sieht das dann so aus:

...
1. Starte OS-Process mit Process p = Runtime.getRuntime().exec(cmdline)
1b. wahlweise kann Standard-input über p.getOutputStream zugefüttert werden
2. Thread A konsumiert den Standard-output p.getInputStream komplett und stirbt dann
3. Thread B konsumiert den Standard-error p.getErrorStream komplett und stirbt dann
4. p.waitFor() blockiert bis A und B fertig sind
5. Ausgaben in A und B können nun verarbeitet werden
...
In Java-Code sieht es dann fast noch einfacher aus:
final Process p = Runtime.getRuntime().exec(cmdline);
// Ein Thread verschlingt den Error Stream
Thread stderrStreamGobbler = new Thread("Standard err stream gobbler") {
  public void run() {
    BufferedReader input = null;
    String line;
    try {
      input = new BufferedReader(new InputStreamReader(p.getErrorStream()));
      while ((line = input.readLine()) != null) {
        System.err.println(line);
      }
    } catch (Exception e) {
      e.printStackTrace();
    } finally {
      if (input != null) {
        try {
          input.close();
        } catch (IOException ignore) {
        }
      }
    }
  }
};
stderrStreamGobbler.start();
// Ein anderer Thread verschlingt den Standard Out Stream
Thread stdoutStreamGobbler = new Thread("Standard out stream gobbler") {
  public void run() {
    BufferedReader input = null;
    String line;
    try {
      input = new BufferedReader(new InputStreamReader(p.getInputStream()));
      while ((line = input.readLine()) != null) {
        System.err.println(line);
      }
    } catch (Exception e) {
      e.printStackTrace();
    } finally {
      if (input != null) {
        try {
          input.close();
        } catch (IOException ignore) {
        }
      }
    }
  }
};
stdoutStreamGobbler.start();
// nun warten, bis InputStream und ErrorStream verschlungen sind
if (p.waitFor() != 0) {
  throw new Exception("Es ist etwas schief gegangen.");
}
:
copyright © 2003-2021 | Dr. Christian Dürr | prozesse-und-systeme.de | all rights reserved