Shell parancs futtatása Java-ban

1. Áttekintés

Ezzel a bemutatóval bemutatjuk a két módot belülről végrehajt egy shell parancsot Jáva kód.

Az első a Futásidő osztály és hívja annak exec módszer.

A második és testreszabhatóbb módszer az a létrehozása és használata ProcessBuilder példa.

2. Az operációs rendszer függősége

Mielőtt létrehoznánk egy újat Folyamat végrehajtva a shell parancsunkat, először meg kell határoznunk azt az operációs rendszert, amelyen a JVM fut.

Ez azért van, mert ablakok, a parancsunkat argumentumként kell futtatnunk a cmd.exe héj és az összes többi operációs rendszeren kiadhatunk egy szabványos héjat, az ún SH:

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

3. Bemenet és kimenet

Továbbászükségünk van arra, hogy bekapcsolódhassunk folyamatunk bemeneti és kimeneti áramába.

Legalább a kimenetet el kell fogyasztani - különben folyamatunk nem tér vissza sikeresen, ehelyett lógni fog.

Vezessünk be egy általánosan használt osztályt StreamGobbler amely egy InputStream:

privát statikus osztály A StreamGobbler megvalósítja a Runnable {private InputStream inputStream; magánfogyasztói fogyasztó; public StreamGobbler (InputStream inputStream, Consumer consumer) {this.inputStream = inputStream; ez.fogyasztó = fogyasztó; } @Orride public void run () {new BufferedReader (new InputStreamReader (inputStream)). Sorok () .forEach (fogyasztó); }}

JEGYZET: Ez az osztály a Futható interfész, ami azt jelenti, hogy bárki végrehajthatja Végrehajtó.

4. Runtime.exec ()

Módszer-hívás Runtime.exec () egy egyszerű, még nem testreszabható módszer egy új részfolyamat létrehozására.

A következő példában a felhasználók saját könyvtárának könyvtárlistáját kérjük, és kinyomtatjuk a konzolra:

String homeDirectory = System.getProperty ("user.home"); Folyamat folyamata; 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 = új StreamGobbler (process.getInputStream (), System.out :: println); Executors.newSingleThreadExecutor (). Subm (streamGobbler); int exitCode = process.waitFor (); állítsa exitCode == 0;

5. ProcessBuilder

Számítási problémánk második megvalósításához a ProcessBuilder. Ezt előnyben részesítik a Futásidő megközelítést, mert képesek vagyunk testre szabni néhány részletet.

Például képesek vagyunk:

  • változtassa meg a munkakönyvtárat, amelyben a shell parancsunk fut builder.directory ()
  • beállíthat egy egyedi kulcs-érték térképet környezetként építő.környezet ()
  • átirányítja a bemeneti és kimeneti adatfolyamokat egyedi helyettesítésekre
  • örökölje mindkettőjüket az áramlat folyamaira JVM folyamat felhasználásával builder.inheritIO ()
ProcessBuilder builder = new ProcessBuilder (); if (isWindows) {builder.command ("cmd.exe", "/ c", "dir"); } else {builder.command ("sh", "-c", "ls"); } builder.directory (új fájl (System.getProperty ("user.home"))); Folyamatfolyamat = builder.start (); StreamGobbler streamGobbler = új StreamGobbler (process.getInputStream (), System.out :: println); Executors.newSingleThreadExecutor (). Subm (streamGobbler); int exitCode = process.waitFor (); állítsa exitCode == 0;

6. Következtetés

Amint ezt a gyors oktatóanyagban láthattuk, végrehajthatunk egy shell parancsot Jáva két különféle módon.

Általában, ha a létrehozott folyamat végrehajtásának testreszabását tervezi, például a munkakönyvtárának megváltoztatásához, fontolja meg egy ProcessBuilder.

Mint mindig, megtalálja a forrásokat a GitHubon.


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