【问题标题】:Where does java stderr go?java stderr 去哪儿了?
【发布时间】:2010-10-13 14:13:34
【问题描述】:

我想知道,java stderr 标准去哪里了?

我知道我可以使用 System.setErr 更改标准错误,它'重新分配“标准”错误输出流。',但我不知道哪个是“标准”。

我想详细说明我的问题: 我有在 java (jni) 中使用的 C++ 库。问题是我似乎看不到来自我的 C++ 库的 stderr 输出。当我运行使用该库的 java api 时,我在 C++ 库中调用了 assert(),但在控制台中看不到输出。

【问题讨论】:

  • 您尝试过 System.stderr.writeln("I'm Here") 吗?你看到了什么?

标签: java c++ java-native-interface stderr


【解决方案1】:

它进入流程的标准错误流,无论设置如何。

  • 如果您从控制台运行应用程序,它也可能会写入控制台。
  • 在 GUI 中,标准输出/错误经常被丢弃,即输出丢失。
  • 在服务(例如 Web 服务器)中,标准错误/输出通常在某处的旋转日志文件中捕获,但这完全取决于服务。

大多数平台允许您将标准错误流重定向到其他地方(例如,到文本文件)。

System.setErr 的想法是允许您使用进程本身的标准错误流,而是对其进行更改,以便对System.err.println 等的调用转到给定的流。

【讨论】:

    【解决方案2】:

    默认情况下 System.err 是控制台,就像 System.out 一样。

    【讨论】:

      【解决方案3】:

      调用者的文件描述符 2。它从那里去哪里——取决于调用者。 在控制台上,您可以将其重定向到其他地方,例如:

      java Example 2>> errors.log
      

      【讨论】:

        【解决方案4】:

        我刚刚编写了一个执行System.err.println 的小测试程序,它似乎会输出到控制台。

        【讨论】:

          【解决方案5】:

          这应该转到 java.io.FileDescriptor.err https://docs.oracle.com/javase/1.5.0/docs/api/java/io/FileDescriptor.html

          System.setErr(new PrintStream(new BufferedOutputStream(new FileOutputStream(java.io.FileDescriptor.err),128),true));
          

          【讨论】:

            【解决方案6】:

            标准错误输出流进入控制台。此流已经打开并准备好接受输出数据。

            有关详细信息,请参阅java sun api

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2011-03-03
              • 2014-03-15
              • 2015-07-17
              • 2012-10-30
              • 2013-05-23
              • 1970-01-01
              • 2012-03-13
              相关资源
              最近更新 更多