2016-07-15 20 views
0

我想將生成的模式輸出到標準輸出。所以我將System.out設置爲SchemaOutputResolver的outputStream。 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"); 

我的問題是,如何將所生成的模式,而不使用jc.generateSchema關閉的System.out到標準輸出?

回答

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

這是個好主意,謝謝。 –