Come eseguire i comandi del terminale Windows, Linux, macOS in Java e restituire il risultato completo

Pubblicato: 2019-02-26

Esegui i comandi Linux mkdir, ls -ltra e ping in Java

L'esecuzione di un system command è relativamente semplice, una volta che l'hai visto eseguito la prima volta.

Implica l'uso di due classi Java, la classe Runtime e la classe Process. Fondamentalmente, usi il exec method della classe Runtime per eseguire il comando come processo separato.

Invocare il metodo exec restituisce un oggetto Process per la gestione del sottoprocesso. Quindi si utilizzano i getInputStream() e getErrorStream() dell'oggetto Process per leggere l'output normale del comando e l'output di errore del comando. Quello che fai con l'output del comando eseguito dipende interamente da te e dall'applicazione che stai creando.

I ProcessBuilder.start() e Runtime.exec creano un processo nativo e restituiscono un'istanza di una sottoclasse di Process che può essere utilizzata per controllare il processo e ottenere informazioni su di esso.

La classe Process fornisce metodi per eseguire l'input dal processo, eseguire l'output nel processo, attendere il completamento del processo, controllare lo stato di uscita del processo e distruggere (uccidere) il processo.

I metodi che creano processi potrebbero non funzionare bene per processi speciali su alcune piattaforme native, come processi di windowing nativi, processi daemon, processi Win16/DOS su Microsoft Windows o script di shell.

Per impostazione predefinita, il processo secondario creato non dispone di un proprio terminale o console. Tutte le sue operazioni di I/O standard (cioè stdin, stdout, stderr) verranno reindirizzate al processo padre, dove è possibile accedervi tramite i flussi ottenuti utilizzando i metodi getOutputStream() , getInputStream() e getErrorStream() .

Il processo padre usa questi flussi per alimentare l'input e ottenere l'output dal sottoprocesso. Poiché alcune piattaforme native forniscono solo dimensioni limitate del buffer per i flussi di input e output standard, la mancata scrittura tempestiva del flusso di input o la lettura del flusso di output del sottoprocesso può causare il blocco del sottoprocesso o addirittura il deadlock.

Di seguito sono riportati due semplici esempi Java come riferimento.

Esempio 1. Esegui mkdir, ls -ltra e ping in Java

  • Crea file CrunchifyCommandJava.java
  • Esegui mkdir /Users/ashah/Desktop/new-folder
  • Esegui ls -ltra /Library
  • Esegui ping crunchify.com

Assicurati di modificare il percorso di conseguenza nel programma sopra in base alle impostazioni di sistema.

Uscita console Eclipse:

Basta eseguire il programma sopra come un'applicazione Java e vedrai un risultato simile.

Esempio-2.

  • CrunchifyRunCommand.java
  • Esegui il comando ps -few per ottenere l'elenco di tutti i processi in esecuzione sul tuo sistema.

Uscita console Eclipse:

Questi sono alcuni dei processi in esecuzione sul mio MacBook Pro. Ce ne sono molti in più ma incollati molto pochi.

Spero che questo tutorial ti aiuti a eseguire qualsiasi comando del terminale Linux, macOS usando un semplice programma Java. Fammi sapere per qualsiasi domanda.