无法在Java中重定向标准输出

时间:2014-01-15 22:22:04

标签: java stdout swi-prolog jpl

我正在尝试将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代码的情况下重定向其输出吗?

1 个答案:

答案 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的内部时才会这样。

我不知道捕捉任何其他输出的方法,我担心。