Mit Prozess über Streams kommunizieren



  • Hallo liebe Mitglieder,

    ich lese schon ein ganzes Weilchen mit und habe mich jetzt registriert, da ich eine Frage habe, bei der ich einfach nicht alleine weiterkomme.

    Ich möchte/muss von meinem Java-Programm aus mit einem Prozess (C-Programm, von dem ich den Quellcode nicht habe) kommunizieren, d.h. Eingaben senden und Ausgaben auslesen. Das C-Programm nimmt Eingaben über die Standardeingabe, macht Berechnungen und schickt das Ergebnis dann an an die Standardausgabe.

    Ich habe im Java API die Klassen Process, ProcessBuilder, OutputStream und InputStream gefunden, um die Aufgabe zu lösen (gibt es Alternativen?). Das Lesen vom Prozess funktioniert auch, nur das Schreiben will einfach nicht:

    try {
    	Process p = new ProcessBuilder(prozessName).start();
    	OutputStream os = p.getOutputStream();
    	// ...
    	String s = new String("test");
    	os.write(s.getBytes());
    	os.flush();
    }
    catch (Exception e) {
    	e.printStackTrace();
    }
    

    Es kommt einfach nichts beim dem Programm an. Ich habe auch noch ein einfaches C++ Programm geschrieben, das nur einen String von std::cin ließt und in eine Datei schreibt, aber auch das hat keinen Erfolg (die Datei bleibt leer).

    Hat jemand von Euch Erfahrung mit sowas? Ich wär echt für jeden Tipp dankbar!

    Dank Euch,
    Christina

    PS: Betriebssystem ist Linux (nur so am Rande...)



  • Ja, das ist nicht immer einfach.
    Ich habe soetwas auch schon mal probiert. Hier der Quellcode:

    C++-Programm (ABC.exe im Verzeichns C:\Fubar):

    #include <iostream>
    
    using namespace std;
    
    int main()
    {
      int a = 0;
    
      cout << "Geben Sie eine Zahl ein: ";
      cin >> a;
    
      cout << endl << "Eingabe: " << a;
    
      return 0;
    }
    

    Und das Java-Programm, welches die Ausgaben des C-Programms empfängt und etwas an dieses schreibt:

    import java.io.*;
    
    public class ABC
    {
    
        public static void main(String[] args)
        {
            try
            {
                Process p = Runtime.getRuntime().exec("C:\\Fubar\\ABC.exe");
                OutputStream out = p.getOutputStream();
                InputStream in = p.getInputStream();
    
                (new AnzeigenThread(in)).start();
    
                Thread.sleep(1000);
    
                out.write(("2\n").getBytes());
                out.flush();
    
                Thread.sleep(1000);
    
                System.out.println("\nBeendet");
                System.exit(0);
            }
            catch (Exception err)
            {
                err.printStackTrace();
            }
        }
    
        static class AnzeigenThread
        extends Thread
        {
            private InputStream in;
    
            public AnzeigenThread(InputStream in)
            {
                this.in = in;
            }
    
            public void run()
            {
                try
                {
                    int i;
                    while ( (i = in.read()) != -1)
                    {
                        System.out.print((char)i);
                    }
    
                    System.out.println("\nThread beendet");
                }
                catch (Exception err)
                {
                    err.printStackTrace();
                }
    
            }
        }
    }
    

    Dieser beiden Programme funktionieren bei mir. Wichtig war auch, dass beim Senden die Zeile mit dem Newline-Zeichen abgeschlossen wird ( "2\n" ).


Anmelden zum Antworten