La libreria di classi Java rappresenta processi esterni che utilizzano la classe java.lang.Process
. I processi possono essere generati utilizzando un java.lang.ProcessBuilder
:
Process process = new ProcessBuilder("processname").start();
o l'interfaccia più vecchio esposto dai sovraccarichi exec
metodi sulla classe java.lang.Runtime
:
Process process = Runtime.getRuntime().exec("processname");
Entrambi questi frammenti di codice deporrà le uova un nuovo processo, che di solito esegue in modo asincrono e può essere interagito con l'oggetto Process
risultante. Se è necessario verificare che il processo sia terminato (o attendere che finisca), non dimenticare di controllare che il valore di uscita (codice di uscita) restituito da process.exitValue()
o process.waitFor()
sia come previsto (0 per la maggior parte dei programmi), poiché l'eccezione viene generata se il processo esce in modo anomalo.
noti inoltre che il codice addizionale è spesso necessario gestire correttamente il processo di I/O, come descritto nella documentation for the Process
class (enfasi aggiunta):
Per default, il sottoprocesso creato non avere il proprio terminale o console. Tutte le operazioni di I/O standard (ovvero stdin, stdout, stderr) verranno reindirizzate al processo principale, a cui è possibile accedere tramite gli stream ottenuti utilizzando i metodi getOutputStream(), getInputStream() e getErrorStream(). Il processo padre utilizza questi flussi per alimentare l'input e ottenere l'output dal sottoprocesso. Poiché alcune piattaforme native forniscono solo dimensioni del buffer limitate per flussi di input e output standard, l'errore per scrivere in modo tempestivo il flusso di input o leggere il flusso di output del sottoprocesso può causare il blocco del sottoprocesso o persino il deadlock.
Un modo per fare in modo che I/O è correttamente gestito e che il valore di uscita indica il successo è quello di utilizzare una libreria come jproc
che si occupa con la complessità di catturare stdout e stderr, e offre una semplice interfaccia sincrona a eseguire processi esterni:
ProcResult result = new ProcBuilder("processname").run();
jproc
è disponibile tramite Maven centrale:
<dependency>
<groupId>org.buildobjects</groupId>
<artifactId>jproc</artifactId>
<version>2.2.0</version>
</dependency>
fonte
2016-08-18 14:42:32
Nota che dovresti usare la forma '.exec (String [])' del metodo , non la singola stringa '.exec (String)' form che * non è un processore da riga di comando * - semplicemente si divide su spazi. Danno lo stesso risultato per questo esempio 'tree.com/A', ma sono diversi se vengono forniti, ad esempio, un nome file che contiene degli spazi. –
È inoltre necessario svuotare il flusso di errori e, se necessario, attendere il valore di uscita del processo. –