Sådan køres en shell-kommando i Java

1. Oversigt

Med denne vejledning illustrerer vi de to måder at udførelse af en shell-kommando indefra Java kode.

Den første er at bruge Kørselstid klasse og kalde dens udføre metode.

Den anden og mere tilpassede måde er at oprette og bruge en ProcessBuilder eksempel.

2. Afhængighed af operativsystem

Før vi skal skabe et nyt Behandle udføre vores shell-kommando, skal vi først bestemme det operativsystem, som vores JVM løber.

Det er fordi, på Windows, er vi nødt til at køre vores kommando som argument til cmd.exe shell og på alle andre operativsystemer kan vi udstede en standard shell, kaldet sh:

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

3. Indgang og udgang

desudenvi har brug for en måde at tilslutte os input- og outputstrømmene til vores proces.

I det mindste output skal forbruges - Ellers vender vores proces ikke tilbage, men i stedet hænger den.

Lad os implementere en almindeligt anvendt klasse kaldet StreamGobbler der forbruger en InputStream:

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

BEMÆRK: Denne klasse implementerer Kan køres interface, hvilket betyder, at det kunne udføres af enhver Eksekutor.

4. Runtime.exec ()

En metodeopkald til Runtime.exec () er en enkel måde, der endnu ikke kan tilpasses, til at gyde en ny delproces.

I det følgende eksempel vil vi anmode om en katalogoversigt over et brugeres hjemmekatalog og udskrive det til konsollen:

String homeDirectory = System.getProperty ("user.home"); Process proces; hvis (isWindows) {proces = Runtime.getRuntime () .exec (String.format ("cmd.exe / c dir% s", homeDirectory)); } andet {process = Runtime.getRuntime () .exec (String.format ("sh -c ls% s", homeDirectory)); } StreamGobbler streamGobbler = ny StreamGobbler (process.getInputStream (), System.out :: println); Executors.newSingleThreadExecutor (). Indsend (streamGobbler); int exitCode = process.waitFor (); hævde exitCode == 0;

5. ProcessBuilder

Til den anden implementering af vores computerproblem bruger vi en ProcessBuilder. Dette foretrækkes frem for Kørselstid tilgang, fordi vi er i stand til at tilpasse nogle detaljer.

For eksempel er vi i stand til at:

  • skift arbejdsmappen, vores shell-kommando kører ved hjælp af builder.directory ()
  • opsætning af et brugerdefineret nøgleværdikort som miljø ved hjælp af builder.environment ()
  • omdirigere input- og outputstrømme til brugerdefinerede udskiftninger
  • arve dem begge til strømmen af ​​strømmen JVM proces ved hjælp af builder.inheritIO ()
ProcessBuilder builder = ny ProcessBuilder (); hvis (isWindows) {builder.command ("cmd.exe", "/ c", "dir"); } andet {builder.command ("sh", "-c", "ls"); } builder.directory (ny fil (System.getProperty ("user.home"))); Process proces = builder.start (); StreamGobbler streamGobbler = ny StreamGobbler (process.getInputStream (), System.out :: println); Executors.newSingleThreadExecutor (). Indsend (streamGobbler); int exitCode = process.waitFor (); hævde exitCode == 0;

6. Konklusion

Som vi har set i denne hurtige vejledning, kan vi udføre en shell-kommando i Java på to forskellige måder.

Generelt, hvis du planlægger at tilpasse udførelsen af ​​den dannede proces, for eksempel for at ændre dens arbejdsmappe, bør du overveje at bruge en ProcessBuilder.

Som altid finder du kilderne på GitHub.