ProcessBuilder застревает после получения ошибки - PullRequest
2 голосов
/ 28 сентября 2010

Я пытаюсь выполнить файл .bat удаленно и реализую следующие строки кода:

ProcessBuilder processBuilder = new ProcessBuilder(command);
    final Process process = processBuilder.start();

    InputStream stderr = process.getErrorStream();
    InputStreamReader isr = new InputStreamReader(stderr);
    BufferedReader br = new BufferedReader(isr);
    String line = null;


    while ((line = br.readLine()) != null) {
        System.out.println(line);

    }
    process.waitFor();
    System.out.println("Waiting ...");

    System.out.println("Returned Value :" + process.exitValue());

но моя программа застревает внутри цикла while. Отображаемая ошибка:

CMD.EXE was started with the above path as the current directory.
UNC paths are not supported.  Defaulting to Windows directory.

Он никогда не выходит из цикла while. Но он успешно выполняет скрипт. Любая помощь приветствуется. Спасибо

Ответы [ 2 ]

3 голосов
/ 28 сентября 2010

Вы должны убедиться, что вы также имеете дело со stderr, и вы должны иметь дело с обоими потоками в отдельных потоках.

Прочитайте это и убедитесь, что вы следуете всем советам.

Редактировать: Глядя на код, который вы написали, вы, похоже, воспроизвели код из этой точной статьи. Фактически это выглядит как листинг 4.3 (MediocreExecJavac.java).

2 голосов
/ 17 января 2014

Добавьте redirectErrorStream (true) перед вами .start () и прочитайте getInputStream (). Это прочитает stderr и объединит его с stdout в один ответ, который можно прочитать с помощью getInputStream ().

    ProcessBuilder processBuilder = new ProcessBuilder(command);
    processBuilder.redirectErrorStream(true);
    final Process process = processBuilder.start();

    InputStream stderr = process.getInputStream();
    InputStreamReader isr = new InputStreamReader(stderr);
    BufferedReader br = new BufferedReader(isr);
    String line = null;


    while ((line = br.readLine()) != null) {
        System.out.println(line);

    }
    process.waitFor();
    System.out.println("Waiting ...");

    System.out.println("Returned Value :" + process.exitValue());
...