Возможная причина java.io.IOException: ошибка CreateProcess = 2, система не может найти указанный файл - PullRequest
0 голосов
/ 19 марта 2012

Я пытаюсь выполнить команду VACUUM VERBOSE через Java. Вот мой код

public void executeCommand()
{
    String cmd1= "cmd.exe /c start";
    String location="C:\\PROGRA~1\\PostgreSQL\\8.3\\bin\\";
    String postgresCommand="psql -h localhost -U postgres -d postgres";
    String autoVaccum="-c \"vacuum verbose\"";
    String []actualCmd={cmd1,location,postgresCommand,autoVaccum};

    Process process=null;
    try {
        process = Runtime.getRuntime().exec(actualCmd);
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}


public static void main(String[] args) {
    MyTest test= new MyTest();
    test.executeCommand();

}

Но я получаю следующее исключение

java.io.IOException: Cannot run program "cmd.exe /c start": CreateProcess error=2, The system cannot find the file specified
    at java.lang.ProcessBuilder.start(Unknown Source)
    at java.lang.Runtime.exec(Unknown Source)
    at java.lang.Runtime.exec(Unknown Source)
    at MyTest.executeCommand(MyTest.java:36)
    at MyTest.main(MyTest.java:48)
Caused by: java.io.IOException: CreateProcess error=2, The system cannot find the file specified
    at java.lang.ProcessImpl.create(Native Method)
    at java.lang.ProcessImpl.<init>(Unknown Source)
    at java.lang.ProcessImpl.start(Unknown Source)
    ... 5 more

Когда я непосредственно набираю вышеуказанные строки непосредственно в окне Пуск-> Выполнить, они успешно выполняются Например. cmd.exe / C запуск C: \ PROGRA ~ 1 / PostgreSQL / 8.3 / bin / psql -h localhost -U postgres -d postgres -c "вакуумный многословный"

Кто-нибудь может знать, что именно не так в вышеуказанной программе?

Ответы [ 2 ]

1 голос
/ 19 марта 2012

Существует несколько способов вызова exec (). Используемый метод on, который принимает String [] в качестве аргумента, ожидает, что каждый токен будет находиться в другой части массива. Итак, призыв к

Runtime.getRuntime().exec("cmd /c start executable arg1 arg2");

при вызове с массивом вместо одной строки называется

Process p = Runtime.getRuntime().exec(new String[]{"cmd","/c","start","executable","arg1","arg2");    
BufferedReader inReader = new BufferedReader(new InputStreamReader(p.getInputStream()));
BufferedWriter outWriter = new BufferedWriter(new OutputStreamWriter(p.getOutputStream()));

exec () возвращает объект Process, который затем можно получить с помощью getInputStream (). Это на самом деле вывод процесса, это ввод в ваш код Java. Затем вы можете прочитать его так же, как любой другой поток, и отобразить его пользователю, как считаете нужным.

0 голосов
/ 19 марта 2012

Вы передаете cmd.exe /c start как один аргумент, поэтому он ищет файл с именем точно cmd.exe /c start и завершается неудачей.

Вместо этого разделите cmd1 на две строки: cmd.exe и /c start

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...