在Java中,我将System.out重定向到ByteArrayOutputStream,但它不工作-为什么?

bhmjp9jg  于 2023-01-19  发布在  Java
关注(0)|答案(1)|浏览(131)

我有下面的类:

class Bla {
   private static final Consumer<String> OUTPUT = System.out::println;

   public void print() {
      printStuff(OUTPUT);
   }

   public void printStuff(Consumer<String> consumer) {
      consumer.accept("Bla");

   }
}

试验代码:

Bla bla = new Bla();
ByteArrayOutputStream baos = new ByteArrayOutputStream();
final PrintStream standardOut = System.out;
System.setOut(new PrintStream(baos));
bla.print();
LOG.info(baos.toString().trim()); <-- This does not work
System.setOut(standardOut);

它什么都不记录。为什么?当我内联OUTPUT时,它就工作了。

qojgxg4l

qojgxg4l1#

问题在于,当Bla类初始化时,它在那个时间点 * 引用System.out *。当您在后续代码中重置System.out时,它对Bla.OUTPUT的值没有影响。
我想这会达到你的目的:

OUTPUT = s -> System.out.println(s);

因为它将总是使用System.out的当前值。

相关问题