Anda berhasrat untuk mencipta program Java yang melaksanakan arahan dalam shell bash dan mengumpul keluaran mereka. Walau bagaimanapun, anda menghadapi masalah dengan berbilang aliran keluaran tidak berfungsi selepas bacaan pertama dan pengecualian "Paip pecah".
1. Gunakan ProcessBuilder:
Ganti Proses Proses = Runtime.getRuntime().exec("/bin/bash"); dengan:
ProcessBuilder builder = new ProcessBuilder("/bin/bash"); builder.redirectErrorStream(true); Process process = builder.start();
ProcessBuilder membenarkan untuk mengubah hala ralat standard ke dalam output standard, menghapuskan keperluan untuk benang berasingan untuk stderr dan stdout.
2. Tunggu Penyiapan Output:
Bacaan gelung daripada strim output (reader.readline()) akan disekat sehingga proses keluar atau menghantar fail akhir. Untuk mengelakkan hang, pastikan gelung berulang hanya apabila output yang dijangkakan telah diterima.
3. Gunakan "Garis Ajaib" untuk Menandai Output Tamat:
Untuk menentukan dengan pasti apabila output daripada arahan yang dilaksanakan selesai, pertimbangkan untuk menulis baris tertentu (cth., "--EOF--") untuk memberi isyarat tamat keluaran. Teknik ini, yang ditunjukkan dalam coretan kod di bawah, membantu mengendalikan senario di mana proses itu tidak ditamatkan dengan aksara baris baharu:
while (scan.hasNext()) { String input = scan.nextLine(); if (input.trim().equals("exit")) { writer.write("exit\n"); } else { writer.write("((" + input + ") && echo --EOF--) || echo --EOF--\n"); } writer.flush(); line = reader.readLine(); while (line != null && ! line.trim().equals("--EOF--")) { System.out.println("Stdout: " + line); line = reader.readLine(); } if (line == null) { break; } }
Nota: Pendekatan ini memastikan semua output daripada arahan yang dilaksanakan ditangkap sebelum arahan lain dimasukkan. Ia membenarkan pelaksanaan berterusan arahan dalam tugas berjadual berulir tanpa menghadapi pengecualian "Paip pecah".
Atas ialah kandungan terperinci Bagaimana untuk Melaksanakan Perintah Bash dengan Amanah dan Menangkap Outputnya di Java?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!