Как мне поймать java.io.PrintStream поместить его вывод в JEditorPane? - PullRequest
0 голосов
/ 29 октября 2010

Я пытаюсь создать программу на Java, в которой пользователь может выбрать любой файл .class или .jar со своего компьютера.Затем моя программа выскочит JInternalFrame с JEditorPane в качестве консоли, захватив любой вывод консоли из программы пользователя.Обратите внимание, что я не хочу перехватывать только вызовы System.err или System.out, но ВСЕ вызовы PrintStream, которые отправляются на консоль.

(отдельный вопрос из запущенной программы в стиле IDE )

Ответы [ 2 ]

3 голосов
/ 29 октября 2010

Вы можете поймать все, что напечатано через System.out, используя System.setOut следующим образом:

import java.io.*;

class SystemOutLogging {

    public static void main(String[] args) throws IOException,
                                                  ClassNotFoundException {
        final PrintStream original = System.out;

        System.setOut(new PrintStream("programlog.txt") {
            public void println(String str) {
                process(str + "\n");
            }

            public void print(String str) {
                process(str);
            }

            private void process(String str) {
                // Fill some JEditorPane
                original.println("Program printed: \"" + str + "\"");
            }
        });

        System.out.print("Hello ");
        System.out.println(" World");
    }
}

Отпечатки:

Program printed: "Hello "
Program printed: " World
"

(естьa System.setErr и System.setIn, который работает аналогичным образом.)

Если вы хотите поймать материал, который «подпрограмма» печатает через System.out.println, выв беде, потому что System.out является статическим, поэтому, если вы запустите несколько «подпрограмм», вы получите беспорядок (поскольку вы не можете передать отдельный класс System каждой подпрограмме).

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

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

0 голосов
/ 30 октября 2010

Если вы запускаете файл .jar пользователя с помощью Runtime.exec (), вы получите объект Process. Этот объект позволит вам получить доступ к запущенным процессам System.out, System.in и System.err.

См .: http://download.oracle.com/javase/1.4.2/docs/api/java/lang/Process.html

Вы можете взять чтение из потоков err и out и добавить его в JEditorPane с помощью обычных методов типа setText.

...