Ciao a tutti, da una vecchia discussione trovata mi è venuta voglia di provare ad eseguire comandi di sistema tramite java, per farlo sto usando le classi ProcessBuilder e Process.
Ho trovato esempi di codice in cui si prova a compilare ed eseguire una classe esterna con ProcessBuilder, sistemando qua e là sono arrivato a questo:
codice:
import java.lang.ProcessBuilder;
import java.io.*;
public class Pb
{
public static void main(String [] args) throws IOException
{
String mainClass="Prova",directory="G:/sparsiJava";
ProcessBuilder cmd = new ProcessBuilder(new String[]{"cmd","/c","javac "+mainClass+".java"});
cmd.directory(new File(directory));
cmd.redirectErrorStream(true);
try
{
Process process=cmd.start();
InputStream is=process.getInputStream();
InputStreamReader isr=new InputStreamReader(is);
BufferedReader br=new BufferedReader(isr);
String line,errori="";
while((line=br.readLine())!=null)errori+=line+"\n";
if(process.waitFor()==0)
{
process.destroy();
cmd=new ProcessBuilder(new String[]{"cmd","/c","java "+mainClass});
cmd.directory(new File(directory));
process=cmd.start();
process.waitFor();
process.destroy();
}
else
{
System.out.print("\nErrori in compilazione:\n\n"+errori);
}
}
catch(InterruptedException ex){}
}
}
A me sembra funzionare, è un buon modo di procedere o si potrebbe far di meglio (che non sia troppo complicato
) ?
Infine, un punto che non riesco a risolvere: supponiamo che la classe Prova richieda l'inserimento di variabili, che io leggevo prima con Scanner, è possibile passare le variabili quando richieste con ProcessBuilder, ma non al momento di far partire il processo ?
Se ad esempio ho una classe Prova così costruita (Tanto per fare un esempio banale):
codice:
import java.util.Scanner;
public class Prova
{
public static void main(String[] args)
{
String scelta="";
while(scelta!=null)
{
System.out.print("\n\nChe operazione vuoi effettuare (1: somma 2: differenza) ? > ");
Scanner scan=new Scanner(System.in);
scelta=scan.nextLine();
if(!scelta.equals("1")&&!scelta.equals("2"))return;
System.out.print("\nInserisci il primo intero > ");
int u=scan.nextInt();
System.out.print("\nInserisci il secondo intero > ");
int d=scan.nextInt();
if(scelta.equals("1"))System.out.print("\nLa somma dei due interi e': "+(u+d));
else System.out.print("\nLa differenza dei due interi e': "+(u-d));
}
}
}
Posso gestire il flusso del programma tramite il ProcessBuilder ?