Cara Menjalankan Perintah Shell di Java

1. Gambaran keseluruhan

Dengan tutorial ini kami akan menggambarkan dua cara untuk melaksanakan perintah shell dari dalam kod Java .

Yang pertama adalah menggunakan kelas Runtime dan memanggil kaedah execnya .

Cara kedua dan lebih disesuaikan, adalah dengan membuat dan menggunakan instance ProcessBuilder .

2. Ketergantungan Sistem Operasi

Sebelum kita akan membuat Proses baru yang melaksanakan perintah shell kita, kita perlu terlebih dahulu menentukan sistem operasi di mana JVM kita berjalan.

Ini kerana, pada Windows , kita perlu menjalankan perintah kita sebagai argumen ke shell cmd.exe dan pada semua sistem operasi lain kita dapat mengeluarkan shell standard, yang disebut sh:

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

3. Input dan Output

Selanjutnyakita memerlukan kaedah untuk menghubungkan aliran input dan output proses kita.

Sekurang-kurangnya output mesti habis digunakan - jika tidak, proses kami tidak berjaya kembali, sebaliknya ia akan bertahan.

Mari kita laksanakan 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 antara muka Runnable , yang bermaksud bahawa ia dapat dijalankan oleh mana-mana Pelaksana .

4. Runtime.exec ()

Panggilan kaedah ke Runtime.exec () adalah cara mudah, belum disesuaikan, untuk menelurkan sub-proses baru.

Dalam contoh berikut, kami akan meminta penyenaraian 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. Pembangun Proses

Untuk pelaksanaan kedua masalah pengkomputeran kami, kami akan menggunakan ProcessBuilder . Ini lebih disukai daripada pendekatan Runtime kerana kami dapat menyesuaikan beberapa perincian.

Contohnya kita dapat:

  • ubah direktori kerja perintah shell kita jalankan menggunakan builder.directory ()
  • sediakan peta nilai kunci khusus sebagai persekitaran menggunakan builder.environment ()
  • ubah aliran input dan output ke penggantian tersuai
  • mewarisi kedua-duanya ke aliran proses JVM semasa 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. Kesimpulannya

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

Secara umum, jika anda berencana untuk menyesuaikan pelaksanaan proses melahirkan, misalnya, untuk mengubah direktori kerjanya, anda harus mempertimbangkan untuk menggunakan ProcessBuilder .

Seperti biasa, anda akan menemui sumber di GitHub .