在Java中重定向标准流

时间:2017-07-02 18:42:09

标签: java

我无法理解我们如何通过调用 System.setOut(PrintStream)来重定向/重置 System.out System.out 被宣布为最终?

setOut(PrintStream out) 应该重新分配 System.out 参数的值,鉴于 System.out 是最终版本,这应该是不可能的。

关于如何做的任何解释?

2 个答案:

答案 0 :(得分:3)

输入/输出/错误字段无需更改。

他们可能只是环绕另一个流。这些包装的流具有默认行为 - 当调用这些setter方法时,您只需替换该“interal”流。

喜欢:System.out使用“internal.out” - 并且使用setter可以将internal.out更改为user.out(例如,仅将这些名称组成)。

答案 1 :(得分:1)

怎么可能?

setOut实现为

public static void setOut(PrintStream out) {
    checkIO();
    setOut0(out);
}

setOut0是在本机系统(JVM)中实现的方法,因此能够更改系统的最终字段:

private static native void setOut0(PrintStream out);

注意:也可以通过反射更改最终字段 - 例如,更改不可变字符串文字的值