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.