如何避免 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);
我想将生成的架构输出到标准输出。所以我将 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);