2016-07-15 4 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에 생성 된 스키마에?

StreamResult result = new StreamResult(new UncloseablePrintStream(System.out))); 

완전히 검증되지 않은,하지만이 간단한 수 있습니다 :

답변

1

또 다른 PrintStream를 래핑하고 close 호출을 무시하는 (말하자면 UncloseablePrintStream을)를 PrintStream 클래스를 만든 다음 할

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

감사합니다. –

관련 문제