Как использовать javas Process.waitFor ()? - PullRequest
0 голосов
/ 30 мая 2011

Я пытаюсь запустить команды командной строки из Java, и быстрая проверка работоспособности дала мне понять, что причина, по которой у меня возникли проблемы, заключается в том, что я не могу заставить работать вызов pr.waitFor() ниже. Эта программа заканчивается менее чем за 30 секунд и ничего не печатает после «foo:». Я ожидал, что это займет чуть более 30 секунд и напечатает случайное число после «foo:». Что я делаю неправильно?

import java.io.BufferedReader;
import java.io.InputStreamReader;

public class Sample {

    public static void main(String[] args) throws Exception {
        Runtime rt = Runtime.getRuntime();
        Process pr = rt.exec("sleep 32; echo $RANDOM");
        pr.waitFor();

        BufferedReader input = new BufferedReader(
                                   new InputStreamReader(pr.getInputStream()));
        String line=null;

        StringBuilder s = new StringBuilder();
        while((line=input.readLine()) != null) {
            System.out.println(s);
            s.append(line);
        }
        System.out.println("foo: " + s.toString());
    }
}

Ответы [ 3 ]

2 голосов
/ 30 мая 2011

Вы должны попробовать это:

Process pr = rt.exec(new String[]{ "bash","-c", "sleep 32; echo $RANDOM" });

Это запускает процесс оболочки, а затем внутри оболочки запускаются ваши команды.Оболочка не возвращается, пока ПОСЛЕ выполнения команд.

Дайте мне знать, если это работает для вас.

2 голосов
/ 30 мая 2011

Process.waitFor() блокирует текущий поток до завершения процесса, после чего управление выполнением возвращается к потоку, который породил процесс.

В опубликованном коде после завершения процесса (т. Е. После вызова Process.waitFor) входной поток завершенного в настоящее время процесса больше не имеет данных, которые можно прочитать. Поэтому чтение содержимого потока и его распечатка не приведет к каким-либо ощутимым данным.

Если вам нужно прочитать содержимое потока, вам нужно создать новый поток, который позаботится о необходимых операциях чтения входного потока и записи в выходной поток по мере необходимости, прежде чем дочерний процесс завершится .

Или вы можете выполнять чтение и запись в одном и том же потоке, но перед тем, как дождаться завершения дочернего процесса. Другими словами, вам нужно переключить последовательность строк, содержащих pr.waitFor();, и строк, которые читаются из InputStream.

Схожий вопрос по SO:

  1. Process.waitFor (), потоки и InputStreams
0 голосов
/ 30 мая 2011

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

Как показано в ответе Феми, вы можете вызвать bash в качестве исполняемого файла и затем передать ему аргументы, которые заставят bash выполнить команды sleep и echo.

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