检查是否';stderr';在Java程序中为空

检查是否';stderr';在Java程序中为空,java,Java,有没有办法在Java程序运行期间检查是否有东西被打印到stderr?举个假例子, if (something == somethingElse) { System.err.println("This is a message"); } // Here, I want to check if stderr is empty, or if something was printed to it 当然,这是可能的(尽管只建议作为测试设置的一部分,而不是作为应用程序本身的一部分) 您可以将S

有没有办法在Java程序运行期间检查是否有东西被打印到
stderr
?举个假例子,

if (something == somethingElse)
{
    System.err.println("This is a message");
}

// Here, I want to check if stderr is empty, or if something was printed to it
当然,这是可能的(尽管只建议作为测试设置的一部分,而不是作为应用程序本身的一部分)

您可以将
System.err
重定向到另一个
PrintStream
。如果该
PrintStream
捕获了缓冲区中的输出,那么您可以稍后检查该缓冲区

如果您还希望看到原始错误流上的输出,正如@ElliotFrisch所建议的,那么您需要做更多的工作:您需要创建一个定制的PrintStream子类,将输出定向到原始System.err以及缓冲区

但是,如果这只是为了捕获单元测试的输出,那么您可能不需要它——您可能希望断言输出包含某些内容

    // Set up alternate System.err PrintStream that prints to a buffer
    ByteArrayOutputStream bytes = new ByteArrayOutputStream();
    PrintStream p = new PrintStream(bytes, true, "UTF-8");
    System.setErr(p);

    if (something == somethingElse) {
        System.err.println("This is a message");
    }

    // Here, I want to check if stderr is empty, or if something was printed
    // to it

    // Capture what was printed so far
    String printedSoFar = bytes.toString("UTF-8");
当然,这是可能的(尽管只建议作为测试设置的一部分,而不是作为应用程序本身的一部分)

您可以将
System.err
重定向到另一个
PrintStream
。如果该
PrintStream
捕获了缓冲区中的输出,那么您可以稍后检查该缓冲区

如果您还希望看到原始错误流上的输出,正如@ElliotFrisch所建议的,那么您需要做更多的工作:您需要创建一个定制的PrintStream子类,将输出定向到原始System.err以及缓冲区

但是,如果这只是为了捕获单元测试的输出,那么您可能不需要它——您可能希望断言输出包含某些内容

    // Set up alternate System.err PrintStream that prints to a buffer
    ByteArrayOutputStream bytes = new ByteArrayOutputStream();
    PrintStream p = new PrintStream(bytes, true, "UTF-8");
    System.setErr(p);

    if (something == somethingElse) {
        System.err.println("This is a message");
    }

    // Here, I want to check if stderr is empty, or if something was printed
    // to it

    // Capture what was printed so far
    String printedSoFar = bytes.toString("UTF-8");

Stderr是一个只写通道,不公开内部状态。以另一种方式维护状态。Stderr是一个只写的通道,不公开内部状态。以另一种方式保持状态。非常有用的答案。快速跟进-使用printedSoFar字符串后,如何将System.err重定向回原始流?@MadhavDatt将原始PrintStream存储在一个变量中:
PrintStream savedsystemer=System.err
并稍后将其放回
System.setErr(savedsystemer)非常有用的答案。快速跟进-使用printedSoFar字符串后,如何将System.err重定向回原始流?@MadhavDatt将原始PrintStream存储在一个变量中:
PrintStream savedsystemer=System.err
并稍后将其放回
System.setErr(savedsystemer)