Rumah  >  Artikel  >  Java  >  ProcessBuilder lwn. Runtime.exec(): Bila Menggunakan Mana untuk Melaksanakan Perintah Luaran?

ProcessBuilder lwn. Runtime.exec(): Bila Menggunakan Mana untuk Melaksanakan Perintah Luaran?

Patricia Arquette
Patricia Arquetteasal
2024-11-17 04:49:03915semak imbas

ProcessBuilder vs. Runtime.exec(): When to Use Which for Executing External Commands?

Memahami Perbezaan antara ProcessBuilder dan Runtime.exec()

Apabila melaksanakan arahan luaran daripada kod Java, pembangun sering menghadapi dua kaedah biasa: Runtime.getRuntime().exec(...) dan ProcessBuilder(...).start(). Walaupun kaedah ini kelihatan serupa, ia mempunyai perbezaan utama yang boleh memberi kesan kepada pelaksanaan arahan.

Lebih Muatan dan Tokenisasi

Runtime.exec() menawarkan kedua-dua rentetan tunggal dan terlampau beban tatasusunan. Apabila menggunakan lebihan rentetan tunggal, rentetan yang dibekalkan ditandakan ke dalam tatasusunan hujah. Tingkah laku tokenisasi ini tidak digunakan pada ProcessBuilder. Pembina ProcessBuilder hanya menerima tatasusunan varargs atau senarai rentetan, dengan mengandaikan setiap rentetan mewakili hujah individu.

Kesan pada Pelaksanaan Perintah

Mari kita gambarkan perbezaan ini dengan contoh. Pada Windows, seruan Runtime.exec() berikut:

Runtime.getRuntime().exec("C:\DoStuff.exe -arg1 -arg2");

akan melaksanakan program "DoStuff.exe" dengan argumen "-arg1" dan "-arg2". Tokenisasi memastikan arahan itu dihuraikan dengan betul.

Sebaliknya, seruan ProcessBuilder berikut akan gagal melainkan program bernama "DoStuff.exe -arg1 -arg2" wujud dalam direktori C::

ProcessBuilder b = new ProcessBuilder("C:\DoStuff.exe -arg1 -arg2");

Untuk melaksanakan arahan dengan betul menggunakan ProcessBuilder, anda mesti sama ada menyediakan argumen secara berasingan:

ProcessBuilder b = new ProcessBuilder("C:\DoStuff.exe", "-arg1", "-arg2");

Atau gunakan senarai:

List<String> params = java.util.Arrays.asList("C:\DoStuff.exe", "-arg1", "-arg2");
ProcessBuilder b = new ProcessBuilder(params);

Implikasi untuk Pengendalian Ralat

Perbezaan dalam tokenisasi arahan boleh menjejaskan pengendalian ralat. Contohnya, jika ProcessBuilder gagal mencari atur cara yang ditentukan, anda mungkin mendapat kod ralat 1001 dan bukannya nilai keluar yang dijangkakan 0. Memahami gelagat tokenisasi Runtime.exec() dan ProcessBuilder adalah penting untuk menyahpepijat ralat tersebut.

Atas ialah kandungan terperinci ProcessBuilder lwn. Runtime.exec(): Bila Menggunakan Mana untuk Melaksanakan Perintah Luaran?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn