Java: BufferedReader считывает самообновляющийся вывод оболочки из скрипта Python и выполняет регулярное выражение, обновляется каждые 5 секунд

1

Проблема заключается в следующем: у меня есть скрипт Python, который генерирует вывод Shell. Этот вывод выглядит следующим образом:

Результат: хорошо.

[123 СКОРОСТЬ] [456 ХОРОШЕЕ] [789 ПЛОХО]

Последняя строка сама обновляется и становится либо результатом: хорошим, либо результатом: плохая строка. Затем последняя строка обновляется и стирает предыдущую. Я нашел способ отключить это поведение в скрипте python, но было бы хорошо, если бы только регулярное выражение отображало последнюю строку вывода оболочки без изменения скрипта python.

Теперь, если я позволю запустить этот код Java над этим выходом, он отображает не нужные результаты, если они есть.

Таймер работает, как я ожидаю, в первые 3 раза, затем он останавливается на 1 минуту, а затем выводит 50 строк с регулярным выражением и даже не тот.

Желаемый результат состоит в том, чтобы вывести первую скобку, вторую скобку и третью скобку в отдельные метки GUI Swing, а затем обновить эти метки каждые n секунд с выхода оболочки python.

        try {
            p = Runtime.getRuntime().exec("myScript.py -Switches");
            pReg = Pattern.compile("\\[(.*?)\\]");
            ScheduledExecutorService exec = Executors.newSingleThreadScheduledExecutor();
            exec.scheduleAtFixedRate(new Runnable() {
              @Override
              public void run() {
                   try {
                      BufferedReader input =
                            new BufferedReader(new InputStreamReader(p.getInputStream()));
                        if ((line = input.readLine()) != null) {
                            // regex
                            Matcher m = pReg.matcher(line);
                            int h = 0;
                            while(m.find()) {
                               myHashArray[h] = m.group(1);
                               h++;
                               Sytem.out.println(m.group(1));
                            }
                        }
                  }
                   catch (IOException e1) {
                        System.err.println(e1);
                        System.exit(1);
                   }
                }
            }, 0, 500, TimeUnit.MILLISECONDS);
        }

        catch (IOException ea) {
            System.exit(0);
        }
Теги:
timer

1 ответ

2
Лучший ответ

Не используйте BufferedReader - используйте InputStreamReader directly--

Или процесс python выводит новые строки между каждым элементом в скобках

BufferedStreamReader ожидает заполнения буфера или для новой строки, прежде чем он вернет что-либо в ваш Java-процесс

  • 0
    Большой! Я попробую это. У вас есть пример того, как этого добиться?

Ещё вопросы

Сообщество Overcoder
Наверх
Меню