Перенаправить содержимое консоли Java в пользовательский интерфейс Java

У меня есть файл пролога (Экспертная система), с которым я консультируюсь из Java, используя библиотеки Jpl (org.jpl7.*), и у меня есть пользовательский интерфейс, в котором я хочу показать вывод запросов пролога. Это мой настраиваемый поток вывода, который должен перенаправлять каждый контент консоли в мой интерфейс (jTextAreaOUTPUT — это место, куда я перенаправляю контент)

public class CustomOutputStream extends OutputStream {
 private JTextArea jTextAreaOUTPUT;

 public CustomOutputStream(JTextArea textArea) {
    jTextAreaOUTPUT = textArea;
 }

 @Override
 public void write(int b) throws IOException {
    // redirects data to the text area
    jTextAreaOUTPUT.append(String.valueOf((char)b));
  // scrolls the text area to the end of data
    jTextAreaOUTPUT.setCaretPosition(jTextAreaOUTPUT.getDocument().getLength());
 }
}

Вот несколько строк, которые у меня есть в моем классе интерфейса: это вызывает метод Custom Output Stream:

PrintStream printStream = new PrintStream(new CustomOutputStream(jTextAreaOUTPUT), true, "UTF-8");
 // keeps reference of standard output stream
 PrintStream standardOut = System.out;
 System.setOut(printStream);
 System.setErr(printStream);

По каким-то странным причинам он не работает с этим файлом пролога (я пробовал с другим, и он работает): пользовательский интерфейс зависает, а содержимое продолжает отображаться в консоли Java (eclipse). Файл экспертной системы работает с инструкцией write в Прологе (например, write('Lorem Ipsum') )

  1. Почему стандартный выход никогда не использовался? Это нормально объявлено таким образом?
  2. Есть ли способ принудительно перенаправить весь текст, который должен быть написан в консоли eclipse?

Я также пытался использовать метод «write Stream» в прологе, но (только для этого файла пролога, возможно, из-за рекурсии) пользовательский интерфейс зависает, даже если вывод записывается в txt файл.


person 5minutsOfBullfight    schedule 05.10.2015    source источник
comment
Возможно, вам придется переопределить другие функции записи в outputstream write(byte[] b), write(byte[] b, int off, int len), если модуль записи не записывает по одному символу за раз.   -  person WillShackleford    schedule 05.10.2015
comment
Ты умеешь это делать или знаешь как? Спасибо   -  person 5minutsOfBullfight    schedule 05.10.2015


Ответы (1)


Возможно, вам придется переопределить другие функции записи в outputstream write(byte[] b), write(byte[] b, int off, int len), если писатель не записывает по одному символу за раз

Чтобы переопределить другие функции записи OutputStream, просто введите код, аналогичный уже написанной вами односимвольной функции:

public class CustomOutputStream extends OutputStream {

    private JTextArea jTextAreaOUTPUT;

    public CustomOutputStream(JTextArea textArea) {
        jTextAreaOUTPUT = textArea;
    }

    @Override
    public void write(int b) throws IOException {
        // redirects data to the text area
        jTextAreaOUTPUT.append(String.valueOf((char) b));
        // scrolls the text area to the end of data
        jTextAreaOUTPUT.setCaretPosition(jTextAreaOUTPUT.getDocument().getLength());
    }

    @Override
    public void write(byte[] b, int off, int len) throws IOException {
        // redirects data to the text area
        jTextAreaOUTPUT.append(new String(b, off, len));
        // scrolls the text area to the end of data
        jTextAreaOUTPUT.setCaretPosition(jTextAreaOUTPUT.getDocument().getLength());
    }

    @Override
    public void write(byte[] b) throws IOException {
        write(b,0,b.length);
    }

}
person WillShackleford    schedule 05.10.2015