[java] 문자열로 OutputStream 가져 오기

java.io.OutputStream의 출력을 Java의 String으로 파이프하는 가장 좋은 방법은 무엇입니까?

방법이 있다고 가정 해보십시오.

  writeToStream(Object o, OutputStream out)

객체에서 특정 스트림으로 특정 데이터를 씁니다. 그러나 가능한 한 쉽게이 출력을 문자열로 가져 오려고합니다.

다음과 같은 클래스를 작성하는 것을 고려하고 있습니다.

class StringOutputStream extends OutputStream {

  StringBuilder mBuf;

  public void write(int byte) throws IOException {
    mBuf.append((char) byte);
  }

  public String getString() {
    return mBuf.toString();
  }
}

그러나 더 좋은 방법이 있습니까? 테스트 만하고 싶습니다!



답변

나는을 사용할 것이다 ByteArrayOutputStream. 그리고 당신은 전화를 할 수 있습니다 :

new String( baos.toByteArray(), codepage );

또는 더 나은 :

baos.toString( codepage );

를 들어 String생성자는이 codepage수 있습니다 String또는 인스턴스 java.nio.charset.Charset을 . 가능한 값은 java.nio.charset.StandardCharsets.UTF_8 입니다.

방법은 toString()만 수락 StringA와 codepage매개 변수 (자바 8 스탠드).


답변

나는 Apache Commons IO 라이브러리를 좋아한다. 뿐만 아니라 메소드 가있는 ByteArrayOutputStream 버전을 살펴보십시오 . Commons 프로젝트와 같은 기존의 신뢰할 수있는 컴포넌트를 사용하면 코드를 더 작고 쉽게 확장하고 용도를 ​​변경할 수 있습니다.toString(String enc)toByteArray()


답변

이것은 잘 작동했습니다

OutputStream output = new OutputStream() {
    private StringBuilder string = new StringBuilder();

    @Override
    public void write(int b) throws IOException {
        this.string.append((char) b );
    }

    //Netbeans IDE automatically overrides this toString()
    public String toString() {
        return this.string.toString();
    }
};

메소드 호출 = >> marshaller.marshal( (Object) toWrite , (OutputStream) output);

그런 다음 문자열을 인쇄하거나 “출력”스트림 자체를 참조하십시오. 예를 들어 문자열을 콘솔에 인쇄하려면 = >> System.out.println(output);

참고 : 내 메서드 호출 marshaller.marshal(Object,Outputstream)은 XML 작업을위한 것입니다. 이 주제와 관련이 없습니다.

이것은 프로덕션 용도로는 매우 낭비이며 변환 방법이 너무 많으며 약간 느슨합니다. 이것은 사용자 정의 OuputStream을 만들고 문자열을 출력하는 것이 가능하다는 것을 증명하기 위해 방금 코딩되었습니다. 그러나 Horcrux7 방식으로 이동하면 단 두 번의 메소드 호출로 모두 좋습니다.

그리고 세상은 또 다른 날에 산다 ….


답변

내가 한 일은 다음과 같습니다.

Obj.writeToStream(toWrite, os);
try {
    String out = new String(os.toByteArray(), "UTF-8");
    assertTrue(out.contains("testString"));
} catch (UnsupportedEncondingException e) {
    fail("Caught exception: " + e.getMessage());
}

여기서 os는입니다 ByteArrayOutputStream.


답변

baos.toString(StandardCharsets.UTF_8);

명명 된 문자 집합을 사용하여 바이트를 디코딩하여 버퍼의 내용을 문자열로 변환합니다.

자바 14-https://docs.oracle.com/


답변