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

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



답변

텍스트 인코딩 문제를 처리하는 것을 실제로 피할 수는 없지만 Apache Commons에는 기존 솔루션이 있습니다.

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


답변

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

new ByteArrayInputStream(inputString.getBytes("UTF-8"))


답변

글쎄, 리더는 문자를 처리하고 InputStream은 바이트를 처리합니다. 인코딩은 문자를 바이트로 표현하는 방법을 지정하므로 문제를 무시할 수 없습니다. 문제를 피하는 것과 관련하여 제 의견은 하나의 문자 집합 (예 : “UTF-8”)을 선택하고 그대로 유지하는 것입니다.

실제로 수행하는 방법과 관련하여 지적했듯이 ” 이러한 클래스의 명백한 이름은 ReaderInputStreamWriterOutputStream 입니다. “놀랍게도 ” 이들은 ‘반대’클래스 인 InputStreamReaderOutputStreamWriter Java 라이브러리에 포함되어 있지 않습니다 . ” 포함.

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

보시다시피 두 클래스의 문서에는 “JRE에서 지원하는 모든 문자 집합 인코딩이 올바르게 처리됩니다”라고 나와 있습니다.

NB 여기에있는 다른 답변 중 하나에 대한 의견은 이 버그를 언급 합니다 . 그러나 이는 Apache Commons IO ReaderInputStream 클래스가 아닌 Apache Ant ReaderInputStream 클래스 ( 여기 )에 영향을줍니다 .


답변

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

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

물론 텍스트 인코딩에 대해 생각할 필요가 있지만 적어도 변환은 한 단계에서 발생합니다.


답변

사용하다:

new CharSequenceInputStream(html, StandardCharsets.UTF_8);

이 방법에 대한 선행 변환이 필요하지 않습니다 String다음에 byte[]보고서가 큰 경우, 할당 더 많은 힙 메모리를. StringBuffer에서 바로 스트림을 읽을 때 즉석에서 바이트로 변환합니다.

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


답변


답변

이러한 클래스의 분명한 이름은 ReaderInputStream 및 WriterOutputStream입니다. 불행히도 이들은 Java 라이브러리에 포함되어 있지 않습니다. 그러나 Google은 당신의 친구입니다.

악몽 같은 모든 텍스트 인코딩 문제를 해결할 수 있을지 모르겠습니다.

RFE가 있지만 Closed이며 수정되지 않습니다.