2010-09-22 61 views
20

Có cách nào để bắt đầu một quy trình trong Java không? in .Net này được thực hiện với ví dụ:Bắt đầu quá trình trong Java?

System.Diagnostics.Process.Start("processname"); 

Có tương đương trong Java để tôi có thể cho phép người dùng tìm ứng dụng và sau đó nó sẽ hoạt động với bất kỳ hệ điều hành nào không?

Trả lời

23

http://www.rgagnon.com/javadetails/java-0014.html

import java.io.*; 
public class CmdExec { 

    public static void main(String args[]) { 
    try { 
     String line; 
     Process p = Runtime.getRuntime().exec 
     (System.getenv("windir") +"\\system32\\"+"tree.com /A"); 
     BufferedReader input = 
     new BufferedReader 
      (new InputStreamReader(p.getInputStream())); 
     while ((line = input.readLine()) != null) { 
     System.out.println(line); 
     } 
     input.close(); 
    } 
    catch (Exception err) { 
     err.printStackTrace(); 
    } 
    } 
} 

Bạn có thể lấy con đường địa phương sử dụng thuộc tính Hệ thống hoặc cách tiếp cận tương tự.

http://download.oracle.com/javase/tutorial/essential/environment/sysprop.html

+5

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 đó. –

+2

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. –

18

Xem Runtime.exec() và lớp Process. Ở dạng đơn giản nhất của nó:

Process myProcess = Runtime.getRuntime().exec(command); 
... 

Lưu ý rằng bạn cũng cần phải đọc quá trình đầu ra (ví dụ: myProcess.getInputStream()) - hoặc quá trình này sẽ treo trên một số hệ thống. Điều này có thể gây nhầm lẫn lần đầu tiên và nên được bao gồm trong bất kỳ giới thiệu nào về các API này. Xem câu trả lời của James P. cho một ví dụ.

Bạn cũng có thể muốn nhìn vào ProcessBuilder lớp mới, mà làm cho nó dễ dàng hơn để thay đổi các biến môi trường và để gọi trình con:

Process myProcess = new ProcessBuilder(command, arg).start(); 
... 
+0

Bạn cũng cần phải đọc đầu ra của quá trình - p.getInputStream() - hoặc quá trình này sẽ treo trên một số hệ thống. Điều này có thể gây nhầm lẫn lần đầu tiên và nên được bao gồm trong bất kỳ giới thiệu nào về các API này. Xem câu trả lời của James P. cho một ví dụ. –

+0

@Andy Cảm ơn. Tôi kết hợp bình luận của bạn vào câu trả lời của tôi nếu bạn không nhớ. – NullUserException

+0

nếu trình phát phương tiện mặc định là VLC và tôi muốn ví dụ như mở "somevideo.avi" và tôi muốn nó sử dụng ứng dụng mặc định là vlc thì sao? – jmasterx

7

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> 
0

đây là logic. giả sử chúng ta muốn chạy các máy tính trong cửa sổ sử dụng java:

Process p = Runtime.getRuntime().exec(System.getenv("windir") + "\\system32\\" + "calc.exe"); 
Các vấn đề liên quan