2012-03-23 48 views
8

Một câu hỏi khác trong kế tiếp nhanh chóng nhưng điều này phải là một lỗi thực sự rõ ràng mà tôi không nhìn thấy. Tôi đã viết một số mã để chạy một tập tin thực thi dưới đây nhưng tôi nhận được một thông báo lỗi nói rằng nó không thể tìm thấy tập tin nhưng tôi có thể đảm bảo với bạn rằng tập tin không tồn tại trong thư mục!ProcessBuilder không thể tìm thấy tệp ?!

public class Pull { 

public void pullData() throws IOException { 
    ProcessBuilder pb = new ProcessBuilder("adb.bat"); 
    File f = new File("C:\\"); 
    pb.directory(f); 
    Process p = pb.start(); 
} 

public static void main(String[] args) throws IOException { 
    Pull pull = new Pull(); 
    pull.pullData(); 
} 

}

và đây là thông báo lỗi

Exception in thread "main" java.io.IOException: Cannot run program "adb.bat" (in directory "C:\"): CreateProcess error=2, The system cannot find the file specified 
+0

Vì vậy, adb.bat là trong c: \, phải không? thử đặt nó hoặc một bản sao của nó trong thư mục dự án – keyser

+0

cũng không hoạt động ở đó. Tôi đang sử dụng processbuilder một cách chính xác? – Rookie

+0

Bạn đã thử thực hiện các nội dung của tệp lô làm đối số cho 'ProcessBuilder' của bạn chưa? Ví dụ: nếu "adb.bat" thực hiện điều gì đó như "java -version", bạn đã thử làm một cái gì đó như 'ProcessBuilder mới (" java "," - server ")'? Tôi tự hỏi nếu Java đang cố gắng để điều trị adb.bat như một thực thi, mặc dù nó thực sự chỉ là một kịch bản dựa trên văn bản. – CodeBlind

Trả lời

11

Tôi đang chạy Linux, nhưng các lỗi tương tự xảy ra khi tôi chạy mã của bạn (sửa đổi để chạy một sh ​​hơn .gậy).

Hãy thử:

ProcessBuilder pb = new ProcessBuilder("c:\\adb.bat"); 

Rõ ràng sử dụng ProcessBuilder.directory không ảnh hưởng đến thư mục làm việc (nhằm mục đích phát hiện các thực thi) mà đã được lựa chọn khi xây dựng được xây dựng (ít nhất, đó là những gì dường như Các tài liệu nói rằng nó sẽ thay đổi thư mục làm việc, vì vậy tôi đoán các tệp đầu vào/đầu ra có thể liên quan đến thư mục đó?)

Tôi không chắc nó thực sự làm gì trong nội bộ, nhưng cung cấp đường dẫn đến tệp thực thi constructor đã khắc phục vấn đề.

Bài đăng này talks about the problem and this solution, nhưng cũng làm tăng các biến môi trường phải được đặt, trong đó biến "giống như" đường dẫn có thể hữu ích để giúp ProcessBuilder phát hiện ra tệp thực thi.

2

Xin chào thử sử dụng hướng dẫn tại đây - http://www.javabeat.net/examples/2007/08/21/using-the-new-process-builder-class/. Sử dụng nó tôi đã thay đổi lớp học của bạn một chút và nó tìm thấy tập tin (lưu ý rằng tôi không biết những gì là bên trong vì vậy không thể kiểm tra đầy đủ nó). Nó biên dịch và chạy mà không có vấn đề, trong khi của riêng bạn tôi gặp vấn đề tương tự như bạn:

public class Pull { 


public void pullData() throws IOException { 
    /*ProcessBuilder pb = new ProcessBuilder("adb.bat"); 
    File f = new File("C:\\"); 
    pb.directory(f); 
    Process p = pb.start(); 
    */ 
    ProcessBuilder p = new ProcessBuilder("C:\\adb.bat"); 
    p.start(); 
    System.out.println(p.toString()); 
} 


public static void main(String[] args) throws IOException { 


    Pull pull = new Pull(); 
    pull.pullData(); 

} 


} 
Các vấn đề liên quan