Hvordan kjøre en shell-kommando i Java

1. Oversikt

Med denne veiledningen illustrerer vi de to måtene for utføre en skallkommando innenfra Java kode.

Den første er å bruke Kjøretid klasse og kalle sin utføre metode.

Den andre og mer tilpassbare måten vil være å lage og bruke en ProcessBuilder forekomst.

2. Avhengighet av operativsystem

Før vi skal lage et nytt Prosess for å utføre skallkommandoen vår, må vi først bestemme operativsystemet som vårt JVM løper.

Det er fordi, på Windows, må vi kjøre kommandoen vår som argument for cmd.exe skall og på alle andre operativsystemer kan vi utstede et standard skall, kalt sh:

boolsk isWindows = System.getProperty ("os.name") .toLowerCase (). startsWith ("windows");

3. Inngang og utgang

Dessutenvi trenger en måte å koble til inngangs- og utgangsstrømmene i prosessen vår.

I det minste utgangen må forbrukes - Ellers kommer ikke prosessen vår vellykket, i stedet vil den henge.

La oss implementere en vanlig brukt klasse kalt StreamGobbler som forbruker en InputStream:

privat statisk klasse StreamGobbler implementerer Runnable {private InputStream inputStream; privat forbruker forbruker; offentlig StreamGobbler (InputStream inputStream, forbrukerforbruker) {this.inputStream = inputStream; this.consumer = forbruker; } @ Override public void run () {new BufferedReader (new InputStreamReader (inputStream)). Linjer () .forEach (forbruker); }}

MERK: Denne klassen implementerer Kjørbar grensesnitt, noe som betyr at det kan kjøres av alle Leder.

4. Runtime.exec ()

En metodekall til Runtime.exec () er en enkel, som ennå ikke kan tilpasses, til å gyte en ny delprosess.

I det følgende eksemplet vil vi be om en katalogoppføring av en hjemmekatalog for brukere og skrive den ut til konsollen:

String homeDirectory = System.getProperty ("user.home"); Prosess prosess; hvis (isWindows) {prosess = Runtime.getRuntime () .exec (String.format ("cmd.exe / c dir% s", homeDirectory)); } annet {prosess = Runtime.getRuntime () .exec (String.format ("sh -c ls% s", homeDirectory)); } StreamGobbler streamGobbler = ny StreamGobbler (process.getInputStream (), System.out :: println); Executors.newSingleThreadExecutor (). Send inn (streamGobbler); int exitCode = process.waitFor (); hevde exitCode == 0;

5. ProcessBuilder

For den andre implementeringen av databehandlingsproblemet bruker vi a ProcessBuilder. Dette foretrekkes fremfor Kjøretid tilnærming fordi vi er i stand til å tilpasse noen detaljer.

For eksempel kan vi:

  • endre arbeidskatalogen vår shell-kommando kjører i builder.directory ()
  • sette opp et tilpasset nøkkelverdikart som miljø ved hjelp builder.environment ()
  • omdirigere inngangs- og utgangsstrømmer til tilpassede erstatninger
  • arve dem begge til strømmen av strømmen JVM prosess ved hjelp builder.inheritIO ()
ProcessBuilder builder = ny ProcessBuilder (); hvis (isWindows) {builder.command ("cmd.exe", "/ c", "dir"); } annet {builder.command ("sh", "-c", "ls"); } builder.directory (ny fil (System.getProperty ("user.home"))); Prosessprosess = builder.start (); StreamGobbler streamGobbler = ny StreamGobbler (process.getInputStream (), System.out :: println); Executors.newSingleThreadExecutor (). Send inn (streamGobbler); int exitCode = process.waitFor (); hevde exitCode == 0;

6. Konklusjon

Som vi har sett i denne raske opplæringen, kan vi utføre en shell-kommando i Java på to forskjellige måter.

Vanligvis, hvis du planlegger å tilpasse utførelsen av den gyte prosessen, for eksempel for å endre arbeidskatalogen, bør du vurdere å bruke en ProcessBuilder.

Som alltid finner du kildene på GitHub.


$config[zx-auto] not found$config[zx-overlay] not found