Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/343.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何避免System.out从回调关闭_Java_Callback_Jaxb_System.out - Fatal编程技术网

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

Java 如何避免System.out从回调关闭,java,callback,jaxb,system.out,Java,Callback,Jaxb,System.out,我想将生成的模式输出到标准输出。因此,我将System.out设置为SchemaOutputResolver的outputStreamStreamResult结果=新的StreamResult(System.out); 但在声明之后: jc.generateSchema(outputResolver) System.out.println()不再工作。通过调试代码,我得到System.out在jc.generateSchema方法之后关闭 JAXBContext jc = JAXBCont

我想将生成的模式输出到标准输出。因此,我将System.out设置为SchemaOutputResolver的outputStream<代码>StreamResult结果=新的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");

我的问题是,如何使用
jc.generateSchema
将生成的模式输出到stdout而不关闭System.out?

创建一个
PrintStream
类(例如,
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
    }
}

创建一个
PrintStream
类(例如,
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);

您可以打印到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分配给wrap类。:)谢谢你的代码。谢谢,这正是我想要的。我写了一些类似的类,但不知道如何将System.out分配给wrap类。:)谢谢你的代码。