Kommunikation mit DOS-Programm

fossybeer

Mitglied
Sehr geehrte Tutorials-Gemeinde,
ich bitte höflichst um Ideen :D

Ich besitze ein DOS-Programm, das spezielle Berechnungen (es geht grob gesagt um Wärmeaustauschberechnungen) durchführt. Dieses Programm möchte ich nun mit meinem Java-Programm nutzen, habe aber noch keine umfassende Idee, wie das möglich ist. Das DOS-Programm ist quasi 'stand-alone' - es gibt keinerlei Schnittstellen o.ä..

Meines Erachtens gibt es drei Schritte:

1. Der Programmstart
dürfte relativ unkompliziert funktionieren.

2. Die Eingabe der Parameter
könnte ich aus dem Java-Programm z.B. per Tastatureingabe an den Prozess senden. Ich habe aber leider noch nichts zu dieser Thematik gefunden. Wer weiß Rat?

3. Die Ausgabe
im DOS-Programm ist eine reine Bildschirmausgabe. Die Position der Lösungen ist immer die gleiche (z.B. Austrittstemperatur steht in der 5. Zeile, ab dem 30. Zeichen).
Gibt es eine Möglichkeit, diese Werte in mein Java-Programm zu übernehmen?

Ich danke für euere Ideen,

Alex

PS Zur Hintergrundinformation: Das Java-Progi soll eine 1D-FEM-Berechnung nebst Optimierungsalgorithmen, Pre- und Postprocessing liefern, allerdings halt ohne die eigentlichen Berechnungen (Processing) zu implementieren.
 
Mit dem ProcessBuilder kannst du dein Programm starten und einen Process erstellen. Von dem Prozess kannst du sowohl Input- als auch Outputstream bekommen und darauf schreiben/davon lesen.
 
Huhu

Das das zu startende Programm ein Konsolenprogramm ist musst du unbedingt den Standard IO und ERR stream auslesen, da der Output des Programms in ne Pipe gestopft wird, und das Konsolenprogramm stehen bleibt, sobald der Puffer voll ist.

Ich habe für dich ein paar Codeschnipsel aus meiner Sammlung die du nutzen kannst.

Hauptklasse:

Java:
package ****.bf2matman.logic;

import java.io.IOException;

/**
 * Diese Klasse bietet die Möglichkeit eine externe Applikation mit Parametern zu starten.<br>
 * Der Konsolenoutput wird umgeleitet und ueber System.out. ausgegeben
 *
 * @author mccae
 */
public class LaunchExe {
   
    //Pfad zur executable
    public static String exePath = "lib/bf2materials.exe";
   
    //Irgendein Parameter
    private String parameter;
   
    //Noch ein Parameter
    private String parameter2;
   
    private Process process;
   
    //Die Streamreader
    private StreamGobbler stdout;
    private StreamGobbler stderr;
   
    public LaunchExe(){
        parameter = "";
        parameter2 = "";
    }
   
    public LaunchExe(String parameter1, String parameter2){
        this.parameter = parameter1;
        this.parameter2 = parameter2;
    }
   
    public void startProcess(){
           
        try{
            /*
             * Erstelle neuen ProcessBuilder.<br>
             * Mehr oder weniger Parameter sind moeglich<p>
             *
             * z.B.: new ProcessBuilder("CPlusPlusProgramm.exe","-param","value","-param2","anothervalue");
             */
            ProcessBuilder pb = new ProcessBuilder(exePath,parameter,parameter2);
               
            /*
             * Startet den Prozess und liefert ein Process objekt<p>
             * HINWEIS: Die Java VM faehrt erst komplett herunter wenn dieser Prozess beendet wurde
             *
             */
            process = pb.start();
               
               
            /*
             *Erstelle die Streamreader.<br>
             * Die Standard output und error streams MUESSEN ausgelesen werden wenn die App Konsolenoutput hat<br>
             * Wird nicht ausgelesen kann dies unter bestimmten Machines (je nach Buffersize) zu freezes fuehren<br>
             * *boese boese*
             */
            stdout = new StreamGobbler(process.getInputStream());
            stderr = new StreamGobbler(process.getErrorStream());
            stdout.start();
            stderr.start();
        }
           
        catch(IOException ex){
            //Errors handlen. Executable nicht gefunden, bla bla bla
            ex.printStackTrace();
        }
    }
}


Streamreader-klasse:

Java:
package ****.bf2matman.logic;

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;

/**
 *
 * @author mccae
 */
public class StreamGobbler implements Runnable{
    private InputStream is;
    private Thread thread;
   
    private volatile boolean finished = false;

    public StreamGobbler (InputStream is) {
        this.is = is;
    }
   
    //Startet den Streamreader in einem neuen Thread
    public void start () {
    thread = new Thread (this);
    thread.start ();
    }
   
    public void run () {
       
        try {
            InputStreamReader isr = new InputStreamReader (is);
            BufferedReader br = new BufferedReader (isr);
           
            while (finished) {
                String s = br.readLine();
               
                //WEITERVERARBEITEN DES OUTPUTS
                System.out.println(s);
               
                if(s==null){
                    finished = true;
                    break;
                }
            }
           
            is.close ();
       
        } catch (Exception ex) {
            System.out.println ("Problem reading stream... :" + ex);
            ex.printStackTrace ();
        }
    }
   
    /**
     * Methode um zu prüfen ob fertig gelesen wurde.<br>
     * Dies geschieht wenn ein Fehler auftrat oder der uebergebene InputStream ordnungsgemaess geschlossen wurde
     *
     * @return true wenn nicht mehr gelesen wird, otherwise false
     */
    public boolean isFinished() {
        return finished;
    }
   
    /**
     * Veranlasst das Beenden des Lesens.<br>
     * Diese Methode ist statt Thread.stop() zu benutzen.
     *
     */
    public void stopRead() {
        this.finished = true;
    }
}

Du kannst den Input auch weiterleiten. Das funktioniert ähnlich wie das Auslesen.

Ich wünsch die viel Spaß beim Berechnen von deinen Temperaturen :D
 
Zuletzt bearbeitet:
Das ist ja ein Service hier! Vielen Dank! ;-)

Es ist zwar gerade ein Auftrag dazwischengekommen, ich werde das aber bald umsetzen! Super! Dankeschön!
 

Neue Beiträge

Zurück