Ako spustiť príkaz Shell v Jave

1. Prehľad

V tomto výučbe si ukážeme dva spôsoby vykonanie príkazu shell zvnútra Java kód.

Prvým je použitie Beh programu triedy a zavolajte jej vykon metóda.

Druhým a prispôsobiteľnejším spôsobom bude vytvorenie a použitie a ProcessBuilder inštancia.

2. Závislosť operačného systému

Predtým, ako vytvoríme nový Proces pri vykonávaní nášho príkazu shellu musíme najskôr určiť operačný systém, na ktorom je náš JVM beží.

To preto, lebo Windows, musíme spustiť náš príkaz ako argument pre cmd.exe shell a na všetky ostatné operačné systémy môžeme vydať štandardný shell, tzv sh:

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

3. Vstup a výstup

Ďalejpotrebujeme spôsob, ako sa zapojiť do vstupných a výstupných tokov nášho procesu.

Najmenej výstup musí byť spotrebovaný - inak sa náš proces nevráti úspešne, ale bude visieť.

Implementujme bežne používanú triedu s názvom StreamGobbler ktorý konzumuje InputStream:

súkromná statická trieda StreamGobbler implementuje Runnable {private InputStream inputStream; súkromný spotrebiteľ; public StreamGobbler (InputStream inputStream, spotrebiteľský spotrebiteľ) {this.inputStream = inputStream; this.consumer = spotrebiteľ; } @Override public void run () {new BufferedReader (new InputStreamReader (inputStream)). Lines () .forEach (consumer); }}

POZNÁMKA: Táto trieda implementuje Spustiteľné čo znamená, že by ho mohol vykonávať ktokoľvek Exekútor.

4. Runtime.exec ()

Metóda volania na Runtime.exec () je jednoduchý, zatiaľ neprispôsobiteľný spôsob, ako vytvoriť nový čiastkový proces.

V nasledujúcom príklade si vyžiadame zoznam domovských adresárov používateľov a ich vytlačenie na konzolu:

Reťazec homeDirectory = System.getProperty ("user.home"); Procesný proces; if (isWindows) {process = Runtime.getRuntime () .exec (String.format ("cmd.exe / c dir% s", homeDirectory)); } else {process = Runtime.getRuntime () .exec (String.format ("sh -c ls% s", homeDirectory)); } StreamGobbler streamGobbler = nový StreamGobbler (process.getInputStream (), System.out :: println); Executors.newSingleThreadExecutor (). Submit (streamGobbler); int exitCode = process.waitFor (); presadiť exitCode == 0;

5. ProcessBuilder

Na druhú implementáciu nášho problému s počítačom použijeme a ProcessBuilder. Toto je preferované pred Beh programu pretože sme schopní prispôsobiť niektoré podrobnosti.

Sme napríklad schopní:

  • zmeňte pracovný adresár, v ktorom je spustený náš príkaz shellu builder.directory ()
  • nastaviť vlastnú mapu kľúč - hodnota ako prostredie pomocou builder.environment ()
  • presmerovať vstupné a výstupné toky na vlastné náhrady
  • dedia obidva z nich na prúdy prúdu JVM proces pomocou builder.inheritIO ()
Builder ProcessBuilder = nový ProcessBuilder (); if (isWindows) {builder.command ("cmd.exe", "/ c", "dir"); } else {builder.command ("sh", "-c", "ls"); } builder.directory (nový súbor (System.getProperty ("user.home"))); Proces proces = builder.start (); StreamGobbler streamGobbler = nový StreamGobbler (process.getInputStream (), System.out :: println); Executors.newSingleThreadExecutor (). Submit (streamGobbler); int exitCode = process.waitFor (); presadiť exitCode == 0;

6. Záver

Ako sme videli v tomto rýchlom výučbe, môžeme vykonať príkaz shell v Java dvoma odlišnými spôsobmi.

Všeobecne platí, že ak plánujete prispôsobiť vykonávanie procesu, ktorý sa tu objavil, napríklad zmeniť jeho pracovný adresár, mali by ste zvážiť použitie ProcessBuilder.

Ako vždy nájdete zdroje na GitHub.


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