ProcessBuilder vs. Runtime.exec(): Memahami Perbezaan
Apabila cuba melaksanakan arahan luaran daripada Java, pembangun sering menghadapi percanggahan dalam tingkah laku antara Runtime.exec() dan ProcessBuilder.start().
Runtime.exec():
Menggunakan Runtime.getRuntime().exec() melibatkan proses dua langkah: tokenisasi dan pelaksanaan . Rentetan input dihuraikan dan ditukar kepada tatasusunan argumen sebelum dilaksanakan.
ProcessBuilder:
Sebaliknya, ProcessBuilder beroperasi secara berbeza. Pembinanya menerima tatasusunan varargs atau senarai rentetan, di mana setiap rentetan mewakili hujah individu. Argumen kemudiannya digabungkan menjadi satu rentetan yang dihantar ke sistem pengendalian.
Kesan ke atas Perlaksanaan:
Perbezaan dalam pengendalian hujah ini boleh memberi kesan kepada pelaksanaan perintah. Sebagai contoh, jika arahan termasuk ruang, Runtime.exec() akan mengendalikan tokenisasi secara automatik, manakala ProcessBuilder memerlukan secara eksplisit mencipta tatasusunan argumen atau senarai.
Contoh:
Pertimbangkan arahan berikut dengan ruang:
"C:\DoStuff.exe -arg1 -arg2"
Menggunakan Runtime.exec():
Process p = Runtime.getRuntime().exec("C:\DoStuff.exe -arg1 -arg2");
Dalam kes ini, arahan akan dilaksanakan seperti yang dimaksudkan, dan exitValue akan menjadi 0.
Menggunakan ProcessBuilder:
Process p = (new ProcessBuilder("C:\DoStuff.exe -arg1 -arg2")).start();
Walau bagaimanapun, menggunakan ProcessBuilder secara langsung tanpa tokenisasi akan menghasilkan ralat atau tingkah laku yang tidak dijangka, mengembalikan exitValue 1001. Untuk membetulkan ini, anda mesti mencipta tatasusunan hujah secara eksplisit:
Process p = (new ProcessBuilder("C:\DoStuff.exe", "-arg1", "-arg2")).start();
Ringkasan:
Secara amnya, apabila menggunakan ProcessBuilder, adalah penting untuk menyediakan argumen sebagai senarai atau tatasusunan yang berasingan, secara eksplisit menunjukkan setiap hujah individu. Langkah tambahan ini memastikan bahawa hujah dihuraikan dengan betul dan perintah luaran dilaksanakan seperti yang dimaksudkan.
Atas ialah kandungan terperinci Runtime.exec() vs. ProcessBuilder.start(): Bilakah Saya Perlu Menggunakan Setiap?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!