在java UI上重定向java控制台内容

时间:2015-10-05 09:41:02

标签: java console prolog swi-prolog jpl

我有一个prolog文件(专家系统),我使用Jpl库(org.jpl7。*)从Java咨询,我有一个UI,我想显示prolog查询的输出。 这是我的自定义输出流,应该将每个控制台内容重定向到我的界面(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());
 }
}

这是我在Interface类中的一些行:它调用自定义输出流方法:

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);

由于一些奇怪的原因,它不适用于这个prolog文件(我尝试了其他的并且它有效):UI冻结和内容一直在java控制台(eclipse)中显示。 专家系统文件与Prolog中的write指令一起使用(例如write('Lorem Ipsum')

  1. 为什么standardOut从未使用过?这样宣布好吗?
  2. 有没有办法强制重定向应该在eclipse控制台中写入的所有文本?
  3. 我也试过用#34;写Stream" prolog中的方法,但是(仅针对此prolog文件,可能是由于递归)即使outpus写在txt文件上,UI也会冻结。

1 个答案:

答案 0 :(得分:0)

如果作者一次不写一个字符,你可能需要覆盖outputstream write(byte [] b),write(byte [] b,int off,int len)中的其他写函数< / p>

要覆盖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);
    }

}