2013-05-30 2 views
1

Когда я пробую этот код, он кажется выполненным, но он не выполняется.Файл не может быть выполнен с Java

Строитель процесса может найти исполняемый файл. Система записывает команды println.

Я нашел несколько примеров кода, но мой исполняемый файл находится не в той же папке с java-файлом.

private static void executeOneFile(String folderPath) { 
    Process p; 
    String exePath = path + "\\" + folderPath + "\\"; 
    try { 
     p = new ProcessBuilder(exePath + "myFile.exe").start(); 
     //p = Runtime.getRuntime().exec("myFile.exe", null , new File(exePath)); 

     System.out.println("p is running"); 
     p.waitFor(); 
     System.out.println("p ended"); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } catch (InterruptedException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
} 
+0

Что происходит? Нет ошибок или исключений? Как вы знаете, что .exe не запускался? –

+0

Вы можете показать, как вы устанавливаете переменную 'path'? У вас есть исключения? – Farlan

+0

Отсутствие ошибки и никаких исключений. Exe должен создать выходной файл, но это не так. Когда я дважды кликаю вручную, он создает. – karakale

ответ

1

Есть несколько проблем, с кодом выше:

  1. Вы не обрабатывать STDIN/STDOUT правильно. Так что, возможно, есть ошибка, но вы ее не увидите, потому что вы не читаете результат дочернего процесса.
  2. Далее, это всегда хорошая идея, чтобы закрыть stdin ребенка с p.getOutputStream().close(), чтобы убедиться, что он не висит в ожидании ввода.
  3. И, наконец, текущий каталог процесса такой же, как и у виртуальной машины Java. Поэтому, если вы используете относительные пути для записи файла, это будет где-то, но редко там, где вы ожидаете. Передайте абсолютный путь файла к вашему дочернему процессу, чтобы убедиться, что вывод идет туда, где он должен.
+0

Спасибо. EXE-файл ожидает большего ввода. поэтому я должен закрыть поток. Я использовал эти строки и исправил проблему: \t Process process = pb.start(); \t process.getInputStream(). Close(); \t process.waitFor(); \t process.getOutputStream(). Flush(); \t process.getOutputStream(). Close(); – karakale

+0

Вы ошибаетесь. Во-первых, вы должны закрыть ** process.getOutputStream() **, потому что это ** выходной поток Java **, который будет дочерними процессами ** input ** –

Смежные вопросы