Italia HyperBanner Network



Avviare programmi da un'applicazione Java

Attraverso il metodo exec() della classe Runtime è possibile avviare programmi da un'applicazione Java. A questo scopo viene creato un oggetto di tipo Process che si occupa di eseguire il comando specificato. Questo ci da la possibilità di mantenere un certo controllo sul nuovo processo. E' infatti possibile procedere l'esecuzione del programma principale parallelamente a quella della applicazione "figlia"; attendere che quest'ultima termini mettendo in attesa il programma principale o, se necessario, interrompere l'esecuzione del processo figlio. E' importante sottolinare che generalmente, le applicazioni Java che fanno uso di questa tecnica perdono le caratteristiche di portabilità intrinseche del linguaggio. Se nel codice abbiamo previsto l'avvio di un processo che esegue, ad esempio, il comando "ls", l'applicazione risultante funzionerà solo su piattaforme Unix o Linux. Per eseguire il programma su un sistema Windows sarà infatti necessario modificare il comando "ls" con l'analogo "dir". Il listato riportato di seguito, esegue un comando in una nuova shell e ne salva l'eventuale output nel file output.txt. Terminata l'esecuzione del processo figlio viene aperto e visualizzato il file output.txt.





import java.io.*;

public class esegui {

public static void EseguiComando (String Comando) throws IOException
{ Process proc = Runtime.getRuntime().exec("start command /c "+Comando+" >output.txt");
char c;
try { proc.waitFor(); }
catch (InterruptedException e) { System.out.println("E' stata rilevata una InterruptedException: "+e.getMessage()); }
InputStream f = new FileInputStream ("output.txt");
while ((c=(char)f.read())!=(char)-1)
System.out.print(c);
}

public static void main (String args[]) throws IOException
{ String Comando = new String();
int k;
for (k=0;k<args.length;k++) { if (k>0) Comando = Comando + " ";
Comando = Comando + args[k];
}
try { System.out.println("Comando: "+Comando);
EseguiComando(args[0]);
}
catch (IOException e) { System.err.println ("E' stata rilevata una IOException: "+e.getMessage()); }
}

}



A seconda del sistema operativo su cui avvierete il vostro programma sarà necessario modificare alcune righe della procedura EseguiComando(). Non ho testato il listato proposto su molti sistemi operativi quindi non vi posso assicurare il corretto funzionamento su ogni piattaforma. La riga che può essere necessario cambiare è la seguente:


Process proc = Runtime.getRuntime().exec("start command /c "+Comando+" >output.txt");


L'opzione "/c" dopo "command" indica alla shell di terminare la sua esecuzione al termine del processo avviato. Su alcuni sistemi Windows infatti sarà necessario riportarla nel seguente modo:


Process proc = Runtime.getRuntime().exec("command /c "+Comando+" >output.txt");


ed eventualmente sostituire il nome dell'interprete dei comando (Solitamente "COMMAND.COM") con quello effettivamente presente sul sistema. Su piattaforme Unix (o Linux) può non essere necessario avviare una nuova shell quindi possimao semplicemente scrivere:


Process proc = Runtime.getRuntime().exec(Comando+" >output.txt");


o se comunque vogliamo che l'applicazione venga avviata in una nuova shell basterà premetterne il nome:


Process proc = Runtime.getRuntime().exec("sh "+Comando+" >output.txt");


Quando è necessario avviare una nuova shell per eseguire un determinato comando nessuno ci assicura che questa conservi le informazioni relative alle variabili di ambiente (e quindi anche ai path). E' quindi possibile che il sistema operativo non riesca a trovare all'interno del file system l'applicazione che state cercando di avviare. Per risolvere questo problema sarà necessario specificare il percorso completo sia della shell scelta, sia dell'applicazione da avviare. In alcuni sistemi Windows è invece necessario utilizzare il comando start che si trova generalmente nella directory \windows\command.

Questo è tutto... se qualcuno dovesse decidere di affrontare il problema in modo più approfondito di quanto ho fatto io può comunque rendermi partecipe dei risultati ottenuti.




Italia HyperBanner Network