Programm aufrufen und verarbeiten?

Java/CppProgrammer

Erfahrenes Mitglied
Hallo allerseits.
Bin grad beim Java lernen und hab mal ne Frage:
mit welcher Methode kann man ein Programm aufrufen?
Wäre ganz Praktisch , wenn man auch den Rückgabewert bekäme, so könnte ich mein C++ Programme aufrufen und müsste sie nur ein kleines bissle umschreiben.
Danke allerseits
 
Hallo Java/CPP Programmer

es gibt in die Klasse Runtime in Java, mit dieser kannst du externe Programme (exe in windows und bin in linux) aufrufen und ausführen.

Ein Runtime Object erhälst du wie folgt:

Runtime rt=Runtime.getRuntime();

Wenn du nun zum Bsp das Notepad öffnen möchtest machst du folgendes:
try{
Process p=rt.exec("C:\winnt\notepad.exe"); //vorrausgesetzt das Verzeichnis etc. existiert
}
catch (RuntimeException re) {
//Fehler-Behandlung
}

über die Process-klasse kannst du jetzt den Status abfragen, sprich falls ein Fehlercode gemeldet wurde, kannst du ihn dort herausholen.

Genauere Beschreibungen findest du hier:
http://java.sun.com/j2se/1.4.2/docs/api/java/lang/Runtime.html
http://java.sun.com/j2se/1.4.2/docs/api/java/lang/Process.html
http://java.sun.com/j2se/1.4.2/docs/api/java/lang/RuntimeException.html



Es gibt aber natürlich auch die Möglichkeit dein C++-Code direkt in Java auszuführen.
Java spezifiziert hierfür die JNI sprich Java Native Interface. Über dieses Interface, kannst du schon erstellten c und c++ code von java aus aufrufen und so tun, als würden es quasi Java Klassen sein. (Ich hoffe ich habe es so richtig ausgedrückt). Nun ja, Du kannst wie gesagt deine schon existierenden C und C++ Klassen über diese Schnittstelle einbinden.
Und natürlich geht dies auch umgekehrt, du kannst java-klassen für C bzw. C++ bereitstellen.

Hier ein Tutorial:
http://java.sun.com/docs/books/tutorial/native1.1/
Ich denke das dürfte Dir weiterhelfen.

Grüsse
Torsten
 
Zuletzt bearbeitet:
Benutzte : Eclipse und SWT


Hi,

hab auch ein Problem mit dem Process Befehl, daher poste ich das mal hier hinter.

Code:
 Runtime rt = Runtime.getRuntime();
 String path = "cdrecord.exe -scanbus";
 Process proc = rt.exec(path, null);

Wo liegt da der Fehler ? ich bekomme immer bei dem rt.exec....... einen Fehler. Die cdrecord.exe ist im gleichen Verzeichnis wie meine *.java Datei.


Was mache ich falsch ?

Gruss und Danke

MFC OpenGL
 
Hallo!

Code:
 /**
  * 
  */
 package de.tutorials;
 
 import org.eclipse.swt.program.Program;
 
 /**
  * @author Tom
  *
  */
 public class ProgrammExecutionExample {
 
 	/**
 	 * @param args
 	 */
 	public static void main(String[] args) {
 		Program.launch("notepad.exe");
 	}
 
 }

Gruß Tom
 
Nö geht auchnet...

Der will das launch nicht finden :(

Wozu brauch ich eigendlich das de.tutorials package ?

Und wenn das mit dem Program gehen würde, wie kann ich dann die in/outputs umlenken ?

Gruss

MFC OpenGL
 
Das de.tutorials-Package ist optional und dient nur einer besseren Strukturierung.

Code:
import org.eclipse.swt.program.Program;
Um die Klasse Program verwenden zu können, muss das Archiv, das dieses Package enthält, im Klassenpath enthalten sein.

Ein- und Ausgaben kann man über die Operatoren </> und <</>> steuern. Z.B.
Code:
dir *.java > javafiles.txt
schreibt alle Dateien mit Endung java des aktuellen Verzeichnisses in die Datei javafiles.txt.

Grundsätzlich glaube ich, dass du - wenn du wirklich Java lernen möchtest - nicht nach Methoden suchen solltest, um deine alten Programme in Java zu recyclen. Versuch doch, sie mit Java-Methoden nachzuprogrammieren, so lernt man :)
 
Hi,

ich will keine Programme "recyclen" ;) Ich programmiere zum Einstieg ein Tutorial nach, und in diesem Tutorial geht es um die Erstellung eines Brennprogramms. Jedoch braucht dieses Programm Informationen bezüglich der Devices, daher greift es auf ein bestehendes Programm zu, welches die Busse scant, und das Ergebnis an die Console zurückgibt. Diese Infos muss ich auslesen.

Das Programm ansich programmiere ich dann selbst ;)

Trotzdem ist mir bisher nicht geholfen worden, hat noch jemand ne Idee ?

Gruss & Danke

MFC OpenGL
 
Wurde eh schon viel Interessantes zu deinem Thema gepostet. Was möchtest du denn noch wissen?

Bezüglich deines externen Programms: du wirst wohl dessen Ausgabe parsen müssen und die für dich wichtigen Informationen rauslesen müssen. Eine Möglichkeit hab ich erwähnt: leite die Ausgabe des Programms in eine Datei um und lies diese aus.

//edit: Process bietet ja sogar getInputStream() und getOutputStream an. Sehr fein :)
 
Zuletzt bearbeitet:
Ja schon klar, aber dann müsste der Benutzer das selbst machen, weil es bei mir nicht funktioniert, das ich einen Commandbefehl aus Java ausführen kann, und das will ich vermeiden...

Daher will ich das ja eigendlich so machen, das ich mit
Code:
Process proc = Runtime.getRuntime().exec("cdrecord -scanbus");
das Programm schreibe, und dann die Streams umleite. Aber der Befehl oben geht bei mir nicht, obwohl ich die erforderliche import drin habe.

Würde das gerne so ans laufen bringen, weil es für den Benutzer hinterher einfacher ist...


Gruss

MFC OpenGL
 
Zurück