Заставьте BufferedReader не ждать завершения процесса - PullRequest
1 голос
/ 27 февраля 2012

У меня есть процесс, который работает под Unix (shell-script). Этот сценарий работает непрерывно и генерирует больше выходных данных каждую секунду.

Теперь я попытался получить текущий вывод, используя BufferedReader в Java. Теперь я понял, что этот процесс ожидает завершения, поэтому он ждет вечно.

Как я могу понять это иначе? Я просто хочу получить текущий вывод Process p в виде строки.

Что я получил до сих пор:

    Process p = Runtime.getRuntime().exec("./myScript.sh");
    InputStream stdin = p.getInputStream();
    InputStreamReader isr = new InputStreamReader(stdin);
    BufferedReader br = new BufferedReader(isr);
    String returner = "";
    String line = null;
    try {
        while ( (line = br.readLine()) != null) {
            returner += line;

        }
    }
    catch (IOException e) {
        System.err.println( "Processhandling went terribly wrong!");
        System.exit(1);
    }

Спасибо за вашу помощь

С уважением, Фло

Ответы [ 3 ]

0 голосов
/ 27 февраля 2012

Поскольку вы получаете непрерывный вывод, следующий код будет работать вечно.

while ( (line = br.readLine()) != null) {
    returner += line;

}

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

0 голосов
/ 27 февраля 2012

Сейчас он будет работать вечно, потому что нет причин останавливаться. Если вы добавите в свой код следующее, вы можете получить то, что хотели.

Например, вы можете поставить условие для остановки следующим образом:

boolean hasReachedGoal = false;
while ( !hasReachedGoal && (line = br.readLine()) != null) {
    hasReachedGoal = line.contains("the string i was looking for")
    returner += line;
}
0 голосов
/ 27 февраля 2012

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

Во-первых, добавление таких строк неэффективно - вам следует использовать StringBuilder, особенно для больших или многочисленных строк.Ваш метод будет становиться все медленнее и медленнее (и в конечном итоге заполнять всю память).

Вы продолжаете добавлять навсегда (до тех пор, пока есть входные данные), так что, как вы говорите, он никогда не завершится.

Вам нужно прочитать порцию данных (возможно, строку за раз, но это зависит от ваших данных) и затем обработать эту порцию (возможно, в другом потоке, чтобы чтение и обработка могли происходить параллельно).

Таким образом, вместо:

    while ( (line = br.readLine()) != null) {
        returner += line;

    }

Вам необходимо:

    while ( (line = br.readLine()) != null) {
        processLine(line);
    }

Где processLine() делает что-то полезное с данными.

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