2

我正在尝试将 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)可以做什么以使其输出不被重定向?难道是它调用了一个生成输出的操作系统进程(它确实调用了 swipl 进程)?如果是这样,我可以在不修改 JPL 代码的情况下重定向其输出吗?

4

1 回答 1

1

是的,您的假设是正确的:正在执行的进程直接打印到控制台。您可以做的是捕获该过程的输出并将其传递给您的 PrintStream,如@StijnGeukens 所示:(复制粘贴的代码如下)

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.

恐怕我不知道捕获任何其他输出的方法。

于 2014-01-15T22:31:51.717 回答