我有一个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')
)
我也试过用#34;写Stream" prolog中的方法,但是(仅针对此prolog文件,可能是由于递归)即使outpus写在txt文件上,UI也会冻结。
答案 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);
}
}