Как читать STDOUT из другого приложения на Java без буферизации - PullRequest
4 голосов
/ 03 апреля 2012

В Java я запускаю приложение C ++, которое регистрирует свой прогресс по мере его прохождения и хочу постоянно следить за его прогрессом, поэтому (в Java) я отслеживаю process.getInputStream () и process.getErrorStream ().Когда я запускаю приложение C ++ из командной строки, журнал отображается по одной строке за раз (примерно 1 строка - 1-2 секунды).С монитора Java я не получаю данные в режиме реального времени и не уверен, кто их буферизирует.

Я могу посмотреть на код C ++ (хотя он довольно сложный) и попытаться поставить flush ()вызывает по мере необходимости, но данные появляются в реальном времени, когда я запускаю их из cmd.exe, поэтому, прежде чем я это сделаю, я хотел бы проверить, есть ли что-то еще на пути, что мне нужно сделать.Что-то в Java мне нужно сделать, чтобы получить данные в реальном времени, чтобы убедиться, что входной поток не буферизован?

Я работаю в Windows XP и выше.

Я пытался

            for (;;) {
                int c = is.read();
                if (c < 0) {
                    break;
                }
                System.out.print(c);
                System.out.flush();
            }
            if (true) {
                return;
            }

, а также пытался

            InputStreamReader isr = new InputStreamReader(is);
            BufferedReader br = new BufferedReader(isr);
            String line = null;
            while ((line = br.readLine()) != null) {
                synchronized (lastActivityTime) {
                    lastActivityTime = java.util.Calendar.getInstance().getTimeInMillis();
                }
                if (pw != null) {
                    pw.println(type + line);
                    pw.flush();
                }
            }

1 Ответ

2 голосов
/ 03 апреля 2012

Буферизация выполняется исходным процессом в библиотеке stdio.Вы ничего не можете с этим поделать в конце Java.Вы должны поместить fflush() вызовы в код C ++ или смириться с этим и ждать.Данные появляются в режиме реального времени при запуске из cmd.exe, потому что stdio ведет себя по-разному, когда присоединяется к тому, что считает реальным терминалом.

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