# Programm aufrufen und verarbeiten?



## Java/CppProgrammer (18. Oktober 2004)

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


----------



## torsch2711 (5. November 2004)

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


----------



## MFC openGL (3. Oktober 2005)

Benutzte : Eclipse und SWT


Hi,

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


```
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


----------



## Thomas Darimont (3. Oktober 2005)

Hallo!


```
/**
  * 
  */
 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


----------



## MFC openGL (3. Oktober 2005)

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


----------



## matdacat (4. Oktober 2005)

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


```
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. 
	
	
	



```
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


----------



## MFC openGL (4. Oktober 2005)

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


----------



## matdacat (4. Oktober 2005)

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


----------



## MFC openGL (4. Oktober 2005)

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 
	
	
	



```
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


----------



## kroesi (4. Oktober 2005)

hast du es mal probeweise mit dem kompletten Pfad probiert ?

krösi


----------



## MFC openGL (4. Oktober 2005)

Ja hab ich... auch kein Erfolg  ;(


----------



## kroesi (4. Oktober 2005)

Hi ,

seltsam,

vielleicht hast eine andere (falsche) Klasse namens "Process" importiert ? 
Richtig ist java.lang.Process !

Ansonsten fällt mir auch nichts mehr ein, bei mir funktiuoniert das so.

Poste vielleicht mal deinen ganzen Code ... und vielleicht mal die Exception oder sonstige Fehler ;-)
Krösi


----------



## Thomas Darimont (4. Oktober 2005)

Hallo!

   schau mal hier:

```
/**
    * 
    */
   package de.tutorials;
   
   import java.io.BufferedInputStream;
   import java.io.BufferedReader;
   import java.io.InputStreamReader;
   
   /**
    * @author Tom
    * 
    */
   public class RuntimeExecExample {
   
   	/**
   	 * @param args
   	 */
   	public static void main(String[] args) throws Exception {
   		Process p = Runtime.getRuntime().exec(
 				new String[] { "net", "send", "localhost", "foo" });
   		int returnCode = p.waitFor();
   		System.out.println(returnCode);
   
   		p = Runtime.getRuntime().exec(new String[] { "ipconfig", "/all" });
   
   		p.getErrorStream().close();
   		p.getOutputStream().close();
   
   		BufferedReader br = new BufferedReader(new InputStreamReader(p
   				.getInputStream()));
   		String line = null;
   		while ((line = br.readLine()) != null) {
   			System.out.println(line);
   		}
   
   		br.close();
   		returnCode = p.waitFor();
   		System.out.println(returnCode);
   
   	}
   
   }
```
 
   und hier:
http://www.javaworld.com/javaworld/jw-12-2000/jw-1229-traps.html

  Weiterhin empfiehlt es sich unter Java 5 die Klasse ProcessBuilder zu verwenden>
http://www.tutorials.de/tutorials175011.html&highlight=ProcessBuilder

   Gruß Tom


----------

