2016-07-15 11 views
0

Я хочу вывести сгенерированную схему в стандартный вывод. Поэтому я установил System.out как outputStream для SchemaOutputResolver. StreamResult result = new StreamResult(System.out); Но после заявления: jc.generateSchema(outputResolver)Как избежать закрытия System.out из обратного вызова

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?

ответ

1

Создать 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 
    } 
} 
+0

Спасибо, Это то, что я хочу. Я написал несколько подобных классов, но не знаю, как назначить System.out классу wrap. :) Спасибо за хороший код. –

1

Вы можете печатать в 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); 
+0

Это хорошая идея. –

Смежные вопросы