2010-10-29 2 views
0

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

(индивидуальный вопрос от IDE-Style program running)

ответ

3

Вы можете поймать все, что печатается через 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 
" 

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

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

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

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

+0

IDE, такие как NetBeans, похоже, не имеют проблем с захватом вызовов System.out с несколькими программами. Кроме того, это не относится к вопросу о размещении всех вызовов в JEditorPane. – Supuhstar

+0

NetBeans и Eclipse - чрезвычайно сложные части программного обеспечения. Не ожидайте, что сможете реплицировать свои системы. Приведенный мною пример дает вам «процесс» -метод. Вы делаете все, что вам нужно, со строками в этом методе. Добавление к JEditorPane не должно быть слишком сложным с этой точки. – aioobe

+0

, хотя это правда, что один программист должен взломать перед тем, как попытаться что-то сделать размером Eclipse или NetBeans, они все еще просто программы. Репликация части их функциональности (в этом случае вывод процесса обработки) не обязательно является трудной или чем-то вне разумных ожиданий. –

0

Если вы начинаете пользователя. 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 и из потоков, и добавить к вашему JEditorPane, используя обычные методы типа SetText.

+0

Если вы прочитали связанный с этим вопрос, вы бы знали, что он не рассматривает это как вариант. – aioobe