Newsgroup: it.comp.java
Titolo: Esecuzione di programma non Java?

E' possibile eseguire un programma gia' compilato all'interno di
un'applicatione java?
Praticamente ho bisogno delle stesse funzionalita' di una open3() di
Perl: eseguire un programma a cui spedire comandi e ricevere risposte
via filehandle.
Any idea?
Grazie.
Ruggero




Puoi utilizzare il metodo exec().
Se ad esempio devi "pilotare" un programma chiamato
dummy.exe, potresti fare:
// Prelevi il runtime dell'applicazione
Runtime rt = Runtime.getRuntime();
// Fai l'exec
Process p = rt.exec("dummy.exe");
// Prelevi gli stream di input e output del processo dummy
InputStream in = p.getInputStream();
OutputStream out = p.getOutputStream();
A questo punto da "in" puoi leggere l'output del processo "dummy"
e puoi inviare su "out" i comandi.
Nota che nelle linee di codice non ho considerato la trattazione
delle eccezioni.
Spero sia d'aiuto. Ciao
Fabio Cuneaz

Ho fatto come è stato suggerito e tutto funziona, 
ma vorrei alcuni chiarimenti...
----------------------------------------------------------------------
 static public void main(String args[]) {
        Runtime r = Runtime.getRuntime();
        try {
            Process p = r.exec("nomefile.exe");
            /*
            InputStream in = p.getInputStream();
            OutputStream out = p.getOutputStream();
            */
        }
        catch (IOException e) {
        }
 }
----------------------------------------------------------------------
1.) Come posso fare a passare dei parametri a 
    linea di comando al file nomefile.exe?
2.) Come posso leggere dall'applicazione Java 
    l'output a video del programma nomefile.exe?
3.) Come posso leggere dall'applicazione Java 
    l'output su un file del programma nomefile.exe?
4.) Come posso terminare forzatamente il programma nomefile.exe?
5.) Tutti i file avviati con in questo modo verranno 
    terminati nel caso in cui terminasse l'applicazione Java? 
    5.1) C'è un modo per evitare che questo accada?
6.) Quale IOException è bene gestire in tutti questi casi?
7.) Sarebbe possibile avviare il programma nomefile.exe
    da un Theread "figlio"?
    7.1) Questo comporta risposte differenti alle domande precedenti?
... naturalmente sono gradite, moolto gradite, linee di codice a
esemplificazione delle risposte!
Mi scuso per tutte queste domande, ma sono sicuro che se le risposte ci
saranno, potranno interessare molti altri che come me stanno iniziando a
programmare in Java. Prometto che a coloro che si ripresenteranno in
seguito con le mie stesse domande risponderò io, ma prima occorre che mi
rispondiate voi!
Grazie a tutti,
Paolo Castagna.

Ti rispondo solo in parte.
Associanod a in e out gli Stream dal processo hai fatto quello che in C si
chiama Pipelining.
Tu hai che "in" corrisponde, anziche' alla console, all'input del
"nomefile.exe", cosi' pure per "out".
Se invece duplichi il tutto, ovvero mantieni in e out come sono di standard
(System.it e System.out sono la console del Java) e ne aggiungi due nuovi,
tipo exeIn e exeOut. Poi prendi i dati da uno e se vuoi li mandi all'altro,
li filtri.
import java.io.*;
                 public class TestExec {
                     public static void main(String args[]) {
                         String s;
                         try {
                             Process myProcess =
Runtime.getRuntime().exec("/usr/bin/ls -l");
                             DataInputStream in = new DataInputStream(
                                 new
BufferedInputStream(myProcess.getInputStream()));
                             while ((s = in.readLine()) != null) {
                                 System.out.println(s);
                             }
                             System.exit(0);
                         }
                         catch (IOException e) {
                             System.out.println("Exception: "+ e);
                             System.exit(-1);
                         }
                     }
                 }
Paolo Castagna wrote:

--
home page: 
http://www.geocities.com/SouthBeach/Breakers/6255