检查是否';stderr';在Java程序中为空
有没有办法在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
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)代码>