【问题标题】:Failing to redirect standard output in Java无法在 Java 中重定向标准输出
【发布时间】:2014-02-04 15:16:05
【问题描述】:

我正在尝试将 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。但是,上面 sn-p 的最后一行会生成一些文本输出,这些文本输出仍会打印在 Java 控制台而不是我的 PrintStream 中。

allSolutions(String) 方法可以做什么以使其输出不被重定向?难道是它调用了一个生成输出的操作系统进程(它确实调用了 swipl 进程)?如果是这样,我可以在不修改 JPL 代码的情况下重定向其输出吗?

【问题讨论】:

    标签: java stdout swi-prolog jpl


    【解决方案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 的内部。

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

    【讨论】:

      猜你喜欢
      • 2012-05-11
      • 1970-01-01
      • 1970-01-01
      • 2014-01-05
      • 2017-09-02
      • 2019-12-30
      • 1970-01-01
      • 1970-01-01
      • 2014-01-20
      相关资源
      最近更新 更多