2016-07-15 10 views
0

生成したスキーマをstdoutに出力したいと思います。そこで、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を閉じずにstdoutに生成されたスキーマをしますか?

答えて

1

その後、ちょうど別のPrintStreamをラップし、close呼び出しを無視しPrintStreamクラス(たとえば、UncloseablePrintStream)、行いを作成します。

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

それはいいアイデアありがとう。 –

関連する問題