Cara Menjalankan Perintah Shell di Java

1. Ikhtisar

Dengan tutorial ini kami akan mengilustrasikan dua cara menjalankan perintah shell dari dalam kode Java .

Yang pertama adalah menggunakan kelas Runtime dan memanggil metode exec .

Cara kedua dan lebih dapat disesuaikan, akan membuat dan menggunakan instance ProcessBuilder .

2. Ketergantungan Sistem Operasi

Sebelum kita akan membuat Proses baru yang mengeksekusi perintah shell kita, kita harus terlebih dahulu menentukan sistem operasi tempat JVM kita berjalan.

Itu karena, di Windows , kami perlu menjalankan perintah kami sebagai argumen ke shell cmd.exe dan di semua sistem operasi lain kami dapat mengeluarkan shell standar, yang disebut sh:

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

3. Input dan Output

Selanjutnyakita membutuhkan cara untuk menghubungkan ke arus masukan dan keluaran dari proses kita.

Setidaknya output harus dikonsumsi - jika tidak proses kami tidak berhasil kembali, malah akan hang.

Mari terapkan kelas yang biasa digunakan yang disebut StreamGobbler yang menggunakan InputStream :

private static class StreamGobbler implements Runnable { private InputStream inputStream; private Consumer consumer; public StreamGobbler(InputStream inputStream, Consumer consumer) { this.inputStream = inputStream; this.consumer = consumer; } @Override public void run() { new BufferedReader(new InputStreamReader(inputStream)).lines() .forEach(consumer); } }

CATATAN: Kelas ini menerapkan antarmuka Runnable , yang berarti dapat dijalankan oleh Pelaksana mana pun .

4. Runtime.exec ()

Metode-panggilan ke Runtime.exec () adalah cara sederhana, belum dapat disesuaikan, untuk menelurkan sub-proses baru.

Dalam contoh berikut kami akan meminta daftar direktori dari direktori-home pengguna dan mencetaknya ke konsol:

String homeDirectory = System.getProperty("user.home"); Process process; 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 = new StreamGobbler(process.getInputStream(), System.out::println); Executors.newSingleThreadExecutor().submit(streamGobbler); int exitCode = process.waitFor(); assert exitCode == 0;

5. ProcessBuilder

Untuk implementasi kedua dari masalah komputasi kami, kami akan menggunakan ProcessBuilder . Ini lebih disukai daripada pendekatan Runtime karena kami dapat menyesuaikan beberapa detail.

Misalnya kami dapat:

  • ubah direktori kerja yang dijalankan perintah shell kita menggunakan builder.directory ()
  • menyiapkan peta nilai kunci kustom sebagai lingkungan menggunakan builder.environment ()
  • mengarahkan aliran input dan output ke penggantian kustom
  • mewarisi keduanya ke aliran proses JVM saat ini menggunakan builder.inheritIO ()
ProcessBuilder builder = new ProcessBuilder(); if (isWindows) { builder.command("cmd.exe", "/c", "dir"); } else { builder.command("sh", "-c", "ls"); } builder.directory(new File(System.getProperty("user.home"))); Process process = builder.start(); StreamGobbler streamGobbler = new StreamGobbler(process.getInputStream(), System.out::println); Executors.newSingleThreadExecutor().submit(streamGobbler); int exitCode = process.waitFor(); assert exitCode == 0;

6. Kesimpulan

Seperti yang telah kita lihat di tutorial singkat ini, kita dapat menjalankan perintah shell di Java dengan dua cara berbeda.

Secara umum, jika Anda berencana untuk menyesuaikan eksekusi proses yang muncul, misalnya, untuk mengubah direktori kerjanya, Anda harus mempertimbangkan untuk menggunakan ProcessBuilder .

Seperti biasa, Anda akan menemukan sumbernya di GitHub .