在 java 中拦截 system.out

Intercept system.out in java

我有一个 system.out 的方法,它在 main 中使用。我怎样才能截取该打印并将其分配给 String 变量?我也不希望它被打印出来。

public void print()
System.out.println("hello");

---main---
print(); // need to intercept this 
String str = print(); // need assign the contents of the print() to str and not show the contents of print in the console

编辑:由于某些限制,我无法创建 .txt,也无法更改方法的代码。我需要在 main

中进行所有更改

您可以调用 System.setOut() to change the PrintStream used by System.out. You probably also want to call setErr() 到相同的 PrintStream

为了说明,让我们使用标准的“Hello World”程序。

public static void main(String[] args) {
    System.out.println("Hello World");
}

输出

Hello World

我们现在用捕获缓冲区中所有输出的打印流替换输出打印流。我们确实保留了原始打印流的副本,因此我们可以在最后打印一些真实的东西。

public static void main(String[] args) {
    PrintStream oldSysOut = System.out;
    ByteArrayOutputStream outBuf = new ByteArrayOutputStream();
    try (PrintStream sysOut = new PrintStream(outBuf, false, StandardCharsets.UTF_8)) {
        System.setOut(sysOut);
        System.setErr(sysOut);
        
        // Normal main logic goes here
        System.out.println("Hello World");
    }
    String output = new String(outBuf.toByteArray(), StandardCharsets.UTF_8);
    oldSysOut.print("Captured output: \"" + output + "\"");
}

输出

Captured output: "Hello World
"

从这里可以看出,所有输出都被捕获,包括来自 println() 调用的换行符。