在 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()
调用的换行符。
我有一个 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()
调用的换行符。