Печать вывода другой программы в текстовую область Java - PullRequest
3 голосов
/ 05 января 2010

Я создаю графический интерфейс с использованием Java. Этот графический интерфейс запускает программу из командной строки, используя класс ProcessBuilder.

Небольшая информация о запущенном процессе: из командной строки он создает другое окно и печатает информацию в указанное окно.

В моем окне графического интерфейса есть текстовая область, куда я бы хотел перенаправить указанный вывод. Первоначально я намеревался использовать объект SwingWorker, чтобы постоянно проверять наличие выходных данных и не задерживать графический интерфейс. Чтобы проверить и убедиться, что у меня был оригинальный синтаксис (даже не вводя GUI в вещи), я решил напечатать вывод из окна вторичного процесса в System.out. Однако, похоже, что-то не так, поскольку я вижу вывод в окне вторичного процесса, но не терминал, с которого я работаю.

Выдержка из кода выглядит следующим образом:

Process p = pb.start(); 
Scanner s = new Scanner(p.getInputStream());

SwingWorker pipe = new SwingWorker<String, Void> (){
    public String doInBackground(){
        while(run){
            if(s.hasNextLine()){
                System.out.println("S has next!");
                System.out.println(s.nextLine());
            }
        }
        return null;
    }
};
pipe.execute();

Логический прогон определен в другом месте программы и имеет значение false, когда процесс p завершается или принудительно завершается (дополнительный вопрос: действительно ли это плохая идея? Я чувствую, что это может быть ...).

У кого-нибудь есть идея, почему я никогда не получаю вывод, когда вижу, что он печатается в другом окне? Первоначально моей реакцией было использование p.getOutputStream (), но Scanner не принимает outputStream в качестве параметра.

Спасибо за ваше время.

Ответы [ 2 ]

3 голосов
/ 06 января 2010

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

2 голосов
/ 05 января 2010

Если внешний процесс записывает свой вывод в свое собственное окно, почти наверняка, что вывод НЕ записывается в STDOUT, что вы и читаете со своим кодом.Если это так, то выходные данные внешней программы будут появляться как в ее окне, так и в сеансе командной строки, из которого она была запущена (если она существовала).Без доступа к источнику внешней программы маловероятно, что вы сможете перехватить ее вывод, если авторы не предусмотрели эту функцию (т. Е. Переключатель командной строки, который перенаправляет вывод в STDOUT вместо окна).

Что касается p.getOutputStream(), то это возвращает поток, который «выводится» с ВАШЕЙ точки зрения - т.е. вы пишете в него для отправки данных процессу 'STDIN.Использование p.getInputStream() будет правильным для случая, когда внешняя программа пишет в свой STDOUT.

...