"BufferedReader.ready" против "while (BufferedReader.readLine ()! = Null)" - PullRequest
1 голос
/ 16 августа 2011

Я новичок в том, что касается Java.Я хотел прочитать стандартный вывод процесса, начатого в Java.Я получил следующий код при поиске в Google:

    Runtime rt = Runtime.getRuntime();
    Process proc = rt.exec(args);
    BufferedReader br = new BufferedReader(
        new InputStreamReader(proc.getInputStream()));
    while(br.ready()){
            System.out.println(br.readLine());
    }

Однако этот код не печатает вывод, который должен произвести процесс (скажем, ls) (кстати, я в Linux, openJDK 1.6)

Но если я изменю цикл while на:

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

, он будет работать как положено.

В чем проблема с предыдущим кодом?Согласно тому, что сказал java api doc, я думал, что они похожи.

Ответы [ 2 ]

5 голосов
/ 16 августа 2011

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

0 голосов
/ 07 апреля 2017

Когда вы достигнете теста ready(), команда еще не выдала никаких выходных данных и возвращает false, немедленно заканчивая цикл.

Ваш второй код работает, потому что блоки вызова readLine()пока он не читает всю строку.Без дальнейшего контроля вывод такого кода будет непредсказуемым, поскольку он зависит от объема вывода, произведенного командой, и от времени, которое требуется для его завершения.

Это очень простой сценарий, поэтому он работает большую частьраз, но это не решение, которое обычно может быть применено.

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