it-swarm-ko.tech

Reader를 InputStream으로 변환하고 Writer를 OutputStream으로 변환하는 방법은 무엇입니까?

텍스트 인코딩 문제를 피하는 쉬운 방법이 있습니까?

87
Andrei Savu

텍스트 인코딩 문제를 다루는 것을 피할 수는 없지만 기존 솔루션이 있습니다.

원하는 인코딩을 선택하기 만하면됩니다.

43
Peter

문자열로 시작하는 경우 다음을 수행 할 수도 있습니다.

new ByteArrayInputStream(inputString.getBytes("UTF-8"))
93
Ritesh Tendulkar

자, Reader는 문자를 처리하고 InputStream은 바이트를 처리합니다. 인코딩은 문자를 바이트로 표현하는 방법을 지정하므로 실제로 문제를 무시할 수 없습니다. 문제를 피하기 위해, 내 의견은 : 하나의 문자 세트 (예 : "UTF-8")를 선택하고 고수하십시오.

실제로 그렇게하는 방법과 관련하여 "이 클래스의 명백한 이름은 ReaderInputStream WriterOutputStream . "놀랍게도" '반대'클래스 인 경우에도 Java 라이브러리 "에 포함되지 않습니다. InputStreamReaderOutputStreamWriter가 포함됩니다 .

따라서 많은 사람들이 Apache Commons IO 를 포함한 자체 구현을 생각해 냈습니다. 라이센스 문제에 따라 프로젝트에 commons-io 라이브러리를 포함 시키거나 소스 코드의 일부를 복사 할 수도 있습니다 (다운로드 가능 여기 ).

보다시피, 두 클래스의 문서에는 "JRE가 지원하는 모든 문자셋 인코딩이 올바르게 처리된다"고 명시되어 있습니다.

N.B. 여기에 다른 답변 중 하나에 대한 의견은 this bug 을 언급합니다. 그러나 이는 Apache Ant ReaderInputStream 클래스 ( here ), not Apache 에 영향을줍니다. Commons IO ReaderInputStream 클래스입니다.

41
Peter Ford

또한 String으로 시작하는 경우 Commons IO 에서 다음과 같이 org.Apache.commons.io.IOUtils를 사용하여 StringReader 작성을 건너 뛰고 InputStream을 한 단계로 작성할 수 있습니다.

InputStream myInputStream = IOUtils.toInputStream(reportContents, "UTF-8");

물론 여전히 텍스트 인코딩에 대해 생각해야하지만 적어도 한 단계에서 변환이 이루어지고 있습니다.

19
Phil Harvey

용도:

new CharSequenceInputStream(html, StandardCharsets.UTF_8);

이 방법으로 String을 (를) 선결제 한 다음 byte[], 보고서가 큰 경우 더 많은 힙 메모리를 할당합니다. StringBuffer에서 스트림을 읽을 때 즉시 바이트로 변환합니다.

Apache Commons IO 프로젝트의 CharSequenceInputStream 를 사용합니다.

8
Oliv
7
Bozho

텍스트 인코딩 문제는 피할 수 없지만 Apache commons-io

이것들은 koders.com의 Peter의 답변에서 언급 된 라이브러리이며, 소스 코드 대신 라이브러리에 링크되어 있습니다.

5
dfrankow

이러한 클래스의 명백한 이름은 ReaderInputStream 및 WriterOutputStream입니다. 불행히도 이들은 Java 라이브러리에 포함되어 있지 않지만 google은 친구입니다.

악의적 인 모든 텍스트 인코딩 문제를 해결할지 확실하지 않습니다.

RFE가 있습니다. 닫혔습니다. 수정하지 않습니다.

5

Reader의 내용을 OutputStream에 쓰려고합니까? 그렇다면 OutputStream에서 OutputStreamWriter를 감싸는 것이 쉬워지고 char에서 ReaderWriters를 씁니다. 독자를 InputStream로 변환하는 대신 [~ var ~] _ :

final Writer writer = new BufferedWriter(new OutputStreamWriter( urlConnection.getOutputStream(), "UTF-8" ) );
int charsRead;
char[] cbuf = new char[1024];
while ((charsRead = data.read(cbuf)) != -1) {
    writer.write(cbuf, 0, charsRead);
}
writer.flush();
// don't forget to close the writer in a finally {} block
4
Sam Barnum

Cactoos (정적 메소드는없고 오브젝트 만)를 사용할 수 있습니다.

다른 방법으로도 변환 할 수 있습니다.

1
yegor256

WriterOutputStream 사용시 경고-이진 데이터를 파일에 올바르게/일반 출력 스트림과 동일하게 쓰는 것을 항상 처리하지는 않습니다. 추적하는 데 시간이 걸리는 문제가 있습니다.

가능하면 출력 스트림을 기본으로 사용하는 것이 좋으며 문자열을 작성해야 할 경우 스트림 주위에 OUtputStreamWriter 래퍼를 사용하여 수행하십시오. 텍스트를 다른 방법보다 바이트로 변환하는 것이 훨씬 안정적이므로 WriterOutputStream이 표준 Java 라이브러리의 일부가 아닌 것 같습니다)

1
romeara