tutorials.de Buch-Aktion 05/2012
ERLEDIGT
NEIN
ANTWORTEN
4
ZUGRIFFE
745
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    Avatar von fossybeer
    fossybeer fossybeer ist offline Mitglied
    Registriert seit
    Jan 2004
    Beiträge
    22
    Sehr geehrte Tutorials-Gemeinde,
    ich bitte höflichst um Ideen

    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.
     

  2. #2
    Avatar von zeja
    zeja zeja ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Sep 2006
    Beiträge
    2.962
    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.
     

  3. #3
    Avatar von fossybeer
    fossybeer fossybeer ist offline Mitglied
    Registriert seit
    Jan 2004
    Beiträge
    22
    Ich werde wohl dann mal dort einsteigen. Vielen Dank!
     

  4. #4
    Avatar von mccae
    mccae mccae ist offline Senfdazugeber
    Registriert seit
    Dec 2007
    Ort
    Wien
    Beiträge
    226
    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:

    Code java:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    
    package at.co.lipski.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 Filip Lipski
     */
    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:

    Code java:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    
    package at.co.lipski.bf2matman.logic;
     
    import java.io.BufferedReader;
    import java.io.InputStream;
    import java.io.InputStreamReader;
     
    /**
     * 
     * @author Filip Lipski
     */
    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
     

  5. #5
    Avatar von fossybeer
    fossybeer fossybeer ist offline Mitglied
    Registriert seit
    Jan 2004
    Beiträge
    22
    Das ist ja ein Service hier! Vielen Dank!

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

Ähnliche Themen

  1. Datenbank-Kommunikation im Delphi-Programm
    Von HarryXVI im Forum Delphi, Kylix, Pascal
    Antworten: 1
    Letzter Beitrag: 20.07.10, 00:57
  2. Kommunikation mit anderem Programm
    Von 3Cyb3r im Forum PHP
    Antworten: 1
    Letzter Beitrag: 04.11.08, 09:14
  3. Kommunikation PC - PPC
    Von Norbert Eder im Forum .NET Archiv
    Antworten: 1
    Letzter Beitrag: 04.09.07, 10:10
  4. Antworten: 0
    Letzter Beitrag: 01.04.07, 18:32
  5. Netzwerk-Kommunikation via Programm
    Von theindra im Forum .NET Archiv
    Antworten: 4
    Letzter Beitrag: 13.10.04, 10:51