Неспособность перенаправить стандартный вывод в Java

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

Вот мой код:

        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, как показано здесь @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,

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

Другие вопросы по тегам