如何避免 System.out 从回调中关闭

How to avoid System.out getting closed from Callback

我想将生成的架构输出到标准输出。所以我将 System.out 设置为 SchemaOutputResolver 的输出流。 StreamResult result = new StreamResult(System.out); 但是声明之后: jc.generateSchema(outputResolver)

System.out.println() 不再起作用了。通过调试代码,我得到 System.out 在 jc.generateSchema 方法后关闭。

  JAXBContext jc = JAXBContext.newInstance(SomeObject.class);
  SchemaOutputResolver outputResolver = new SchemaOutputResolver() {

    @Override
    public Result createOutput(String namespaceUri, String suggestedFileName)
        throws IOException {

      StreamResult result = new StreamResult(System.out);

      result.setSystemId(namespaceUri);


      // return result
      return result;
    }
  };
  jc.generateSchema(outputResolver);
  System.out.println("this String can't be output");

我的问题是,如何在不关闭 System.out 的情况下使用 jc.generateSchema 将生成的模式输出到标准输出?

创建一个 PrintStream class(例如,UncloseablePrintStream),它只包装另一个 PrintStream 并忽略 close 调用,然后执行:

StreamResult result = new StreamResult(new UncloseablePrintStream(System.out)));

完全 未经测试,但可能就是这么简单:

import java.io.PrintStream;

public class UncloseablePrintStream extends PrintStream {
    public UncloseablePrintStream(PrintStream ps) {
        super(ps);
    }

    @Override
    public void close() {
        // Do nothing
    }
}

您可以打印到 ByteArrayOutputStream,然后根据需要使用它:

ByteArrayOutputStream baos = new ByteArrayOutputStream();
PrintStream ps = new PrintStream(baos);
StreamResult result = new StreamResult(ps);
System.out.println(new String(baos.toByteArray(), StandardCharsets.UTF_8));

result.setSystemId(namespaceUri);