Java Class Library đại diện cho các quá trình bên ngoài bằng cách sử dụng lớp java.lang.Process
. Quá trình có thể được sinh ra bằng cách sử dụng java.lang.ProcessBuilder
:
Process process = new ProcessBuilder("processname").start();
hoặc giao diện cũ hơn tiếp xúc do quá tải exec
phương pháp trên lớp java.lang.Runtime
:
Process process = Runtime.getRuntime().exec("processname");
Cả hai sẽ mã hóa các đoạn mã sẽ spawn một quá trình mới, trong đó thường thực hiện không đồng bộ và có thể tương tác với thông qua đối tượng Process
kết quả. Nếu bạn cần kiểm tra xem quá trình đã hoàn thành chưa (hoặc đợi nó kết thúc), đừng quên kiểm tra xem giá trị thoát (mã thoát) có được trả về bởi process.exitValue()
hoặc process.waitFor()
như mong đợi (0 cho hầu hết các chương trình), vì không ngoại lệ được ném nếu quá trình thoát ra bất thường.
Cũng lưu ý rằng mã bổ sung thường là cần thiết để xử lý của quá trình I/O chính xác, như mô tả trong documentation for the Process
class (nhấn mạnh thêm):
Theo mặc định, tiến trình con tạo ra không có thiết bị đầu cuối của mình hoặc giao diện điều khiển. Tất cả các hoạt động I/O tiêu chuẩn (tức là stdin, stdout, stderr) sẽ được chuyển hướng tới tiến trình cha, nơi chúng có thể được truy cập thông qua các luồng thu được bằng các phương thức getOutputStream(), getInputStream() và getErrorStream(). Quá trình cha mẹ sử dụng các dòng này để nạp vào và lấy đầu ra từ tiến trình con. Bởi vì một số nền tảng gốc chỉ cung cấp kích thước bộ đệm giới hạn cho luồng đầu vào và đầu ra tiêu chuẩn, không ghi nhanh luồng đầu vào hoặc đọc luồng đầu ra của quy trình con có thể khiến cho quá trình con chặn hoặc thậm chí bế tắc.
Một cách để đảm bảo rằng I/O được xử lý một cách chính xác và giá trị xuất cảnh chỉ ra thành công là sử dụng một thư viện như jproc
giao dịch với những phức tạp của chụp stdout và stderr, và cung cấp một giao diện đồng bộ đơn giản để chạy quá trình bên ngoài:
ProcResult result = new ProcBuilder("processname").run();
jproc
có sẵn qua maven trung ương:
<dependency>
<groupId>org.buildobjects</groupId>
<artifactId>jproc</artifactId>
<version>2.2.0</version>
</dependency>
Nguồn
2016-08-18 14:42:32
Lưu ý rằng bạn nên sử dụng biểu mẫu '.exec (String [])' của phương thức , không phải là chuỗi đơn '.exec (String)' mà * không phải là bộ xử lý dòng lệnh * - nó chỉ đơn giản là chia tách trên không gian. Chúng đưa ra kết quả tương tự cho ví dụ này 'tree.com/A' nhưng khác nhau nếu được đưa ra, ví dụ, một tên tệp có dấu cách trong đó. –
Bạn cũng nên xóa luồng lỗi và nếu cần, hãy đợi giá trị đầu ra của quá trình. –