2014-01-15 3 views
2

Я пытаюсь перенаправить вывод консоли библиотеки Java в JTextArea в моем приложении. Эта библиотека является JPL, мостом между Java и SWI-Prolog (хотя я сомневаюсь, что это имеет большую значимость концептуально).Не удалось перенаправить стандартный вывод в Java

Вот мой код:

 PrintStream out = new PrintStream(new MyOutputStream(), true, "UTF-8"); 
     System.setOut(out); 
     System.setErr(out); 

     System.out.println("This text is successfully redirected."); 

     Hashtable<String, Term> solutions[] = Query.allSolutions("append([1],[2],[1,2])"); 

Когда я запускаю этот код, строка «Этот текст успешно перенаправлен» перенаправляется на мой PrintStream, как и ожидалось. Тем не менее, последняя строка вышеприведенного фрагмента генерирует некоторый текстовый вывод, который все еще печатается на консоли Java, а не в моем PrintStream.

Что может сделать метод allSolutions(String), чтобы его выход не перенаправлялся? Может ли это быть фактом, что он вызывает процесс ОС, который генерирует вывод (он вызывает процесс swipl)? Если да, могу ли я перенаправить свой вывод без изменения кода JPL?

ответ

1

Да, ваше предположение верно: выполняемый процесс печатает непосредственно на консоли. То, что вы можете сделать перехватывать вывод этого процесса и передать его на PrintStream, как показано here по @StijnGeukens: (копировать вставить код следует)

String line; 
Process p = Runtime.getRuntime().exec(...); 
BufferedReader input = new BufferedReader(new InputStreamReader(p.getInputStream())); 
while ((line = input.readLine()) != null) { 
    System.out.println(line); 
} 
input.close(); 

Но это только если у вас действительно есть доступ к внутренним от allSolutions.

Я не знаю способа захвата любого другого выхода, я боюсь.

Смежные вопросы