我正在尝试将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)
可以做什么,以使其输出不被重定向?是不是它调用了一个生成输出的OS进程(它确实调用了swipl进程)?如果是这样,我可以在不修改JPL代码的情况下重定向其输出吗?
答案 0 :(得分:1)
是的,您的假设是正确的:正在执行的过程直接打印到控制台。您可以做的是捕获该进程的输出并将其传递给您的PrintStream,如@ {StijnGeukens所示here :(复制粘贴的代码如下)
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
的内部时才会这样。
我不知道捕捉任何其他输出的方法,我担心。