Kako pokrenuti naredbu ljuske na Javi

1. Pregled

Ovim uputstvom ilustrirat ćemo dva načina izvršavanje naredbe ljuske iznutra Java kodirati.

Prvo je korištenje Vrijeme izvođenja razreda i nazovite svoj izvršiti metoda.

Drugi i prilagodljiviji način bit će stvaranje i korištenje a ProcessBuilder primjer.

2. Ovisnost operativnog sustava

Prije nego što krenemo u stvaranje novog Postupak izvršavajući našu naredbu ljuske, prvo moramo odrediti operativni sustav na kojem se nalazi naš JVM trči.

To je zato što, na Windows, trebamo pokrenuti našu naredbu kao argument za cmd.exe shell i na svim ostalim operativnim sustavima možemo izdati standardnu ​​ljusku, tzv sh:

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

3. Ulaz i izlaz

Nadaljetrebamo način da se uključimo u ulazne i izlazne tokove našeg procesa.

Barem izlaz mora biti potrošen - inače se naš proces ne vraća uspješno, umjesto toga će visjeti.

Provedimo uobičajenu klasu tzv StreamGobbler koja troši an InputStream:

privatna statička klasa StreamGobbler implementira Runnable {private InputStream inputStream; privatni potrošački potrošač; javni StreamGobbler (InputStream inputStream, potrošački potrošač) {this.inputStream = inputStream; this.consumer = potrošač; } @Override public void run () {new BufferedReader (new InputStreamReader (inputStream)). Lines () .forEach (potrošač); }}

BILJEŠKA: Ova klasa provodi Izvodljivo sučelje, što znači da ga može izvršiti bilo tko Izvršitelj.

4. Runtime.exec ()

Metod-poziv na Runtime.exec () je jednostavan, još nije prilagodljiv način stvaranja novog potprocesa.

U sljedećem ćemo primjeru zatražiti popis direktorija kućnog direktorija korisnika i ispisati ga na konzolu:

Niz homeDirectory = System.getProperty ("user.home"); Proces procesa; if (isWindows) {process = Runtime.getRuntime () .exec (String.format ("cmd.exe / c dir% s", homeDirectory)); } else {proces = Runtime.getRuntime () .exec (String.format ("sh -c ls% s", homeDirectory)); } StreamGobbler streamGobbler = novi StreamGobbler (process.getInputStream (), System.out :: println); Izvršitelji.newSingleThreadExecutor (). Submit (streamGobbler); int exitCode = process.waitFor (); tvrditi exitCode == 0;

5. ProcessBuilder

Za drugu implementaciju našeg računalnog problema koristit ćemo ProcessBuilder. Ovo se daje prednost nad Vrijeme izvođenja pristup jer možemo prilagoditi neke detalje.

Na primjer, možemo:

  • promijenite radni direktorij koji koristi naša naredba ljuske builder.directory ()
  • postaviti prilagođenu mapu ključ / vrijednost kao okruženje pomoću builder.environment ()
  • preusmjeriti ulazne i izlazne tokove na prilagođene zamjene
  • naslijediti obojicu u strujama struje JVM obraditi pomoću builder.inheritIO ()
Builder ProcessBuilder = novi ProcessBuilder (); if (isWindows) {builder.command ("cmd.exe", "/ c", "dir"); } else {builder.command ("sh", "-c", "ls"); } builder.directory (nova datoteka (System.getProperty ("user.home"))); Procesni postupak = builder.start (); StreamGobbler streamGobbler = novi StreamGobbler (process.getInputStream (), System.out :: println); Izvršitelji.newSingleThreadExecutor (). Submit (streamGobbler); int exitCode = process.waitFor (); tvrditi exitCode == 0;

6. Zaključak

Kao što smo vidjeli u ovom brzom vodiču, naredbu ljuske možemo izvršiti u Java na dva različita načina.

Općenito, ako planirate prilagoditi izvršavanje spawn procesa, na primjer, za promjenu njegove radne mape, trebali biste razmotriti upotrebu ProcessBuilder.

Kao i uvijek, pronaći ćete izvore na GitHubu.