2012-03-23 17 views
8

Kolejne pytanie w krótkim odstępie czasu, ale musi to być naprawdę oczywisty błąd, którego nie widzę. Napisałem kod, aby uruchomić plik wsadowy poniżej, ale dostaję komunikat o błędzie z informacją, że nie można go znaleźć, ale zapewniam, że plik istnieje w katalogu!ProcessBuilder nie może znaleźć pliku ?!

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(); 
} 

}

i tutaj jest komunikat o błędzie

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

Tak więc, adb.bat znajduje się w c: \, prawda? spróbuj umieścić go lub jego kopię w folderze projektu – keyser

+0

też tam nie działa. Czy poprawnie używam procesora? – Rookie

+0

Czy próbowałeś wykonać zawartość pliku wsadowego jako argumenty do 'ProcessBuilder'? Np. Jeśli "adb.bat" robi coś w rodzaju "java -version", czy próbowałeś zrobić coś takiego jak 'nowy ProcessBuilder (" java "," - serwer ")'? Zastanawiam się, czy Java próbuje traktować adb.bat jak plik wykonywalny, mimo że jest to po prostu skrypt tekstowy. – CodeBlind

Odpowiedz

11

Używam Linuksa, ale ten sam błąd występuje podczas uruchamiania kodu (zmodyfikowany uruchomić .sh zamiast .nietoperz).

Spróbuj:

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

Widocznie za pomocą ProcessBuilder.directory nie wpływa katalog roboczy (dla celów odkrywania wykonywalny), który został wybrany, gdy budowniczy została skonstruowana (przynajmniej, że to, co wydaje się Dokumenty mówią, że zmieni to katalog roboczy, więc domyślam się, że pliki wejściowe/wyjściowe mogą być względne?)

Nie jestem pewien, co właściwie robi wewnętrznie, ale podaje ścieżkę do pliku wykonywalnego w konstruktor naprawił problem.

Ten wpis talks about the problem and this solution, ale także podnosi, czy należy ustawić zmienne środowiskowe, których zmienne "ścieżkowe" mogą być użyteczne, aby pomóc w wykryciu pliku wykonywalnego.

2

Cześć, spróbuj użyć tutoriala tutaj - http://www.javabeat.net/examples/2007/08/21/using-the-new-process-builder-class/. Używając go trochę zmieniłem twoją klasę i znalazłem plik (pamiętaj, że nie wiem, co jest w środku, więc nie mogę go w pełni przetestować). Kompiluje się i działa bezproblemowo, podczas gdy ja sam mam takie same problemy jak ty:

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(); 

} 


} 
Powiązane problemy