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

StackOverflow https://stackoverflow.com/questions/62241

  •  09-06-2019
  •  | 
  •  

문제

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

도움이 되었습니까?

해결책

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

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

다른 팁

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

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

글쎄요, Reader는 문자를 다루고, InputStream은 바이트를 다룹니다.인코딩은 문자를 바이트로 표시하는 방법을 지정하므로 문제를 실제로 무시할 수 없습니다.문제 방지에 관한 제 의견은 다음과 같습니다.하나의 문자 세트를 선택하십시오(예:"UTF-8")을 사용하고 이를 고수하세요.

실제로 이를 수행하는 방법에 대해서는 지적한 바와 같이 "이 클래스의 명백한 이름은 다음과 같습니다. 리더입력스트림 그리고 기록기출력스트림."놀랍게도"이는 Java 라이브러리에 포함되어 있지 않습니다." '반대' 수업임에도 불구하고, 입력스트림리더 그리고 출력스트림작성기 ~이다 포함됩니다.

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

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

NB여기에 언급된 다른 답변 중 하나에 대한 의견 이 버그.하지만 이는 Apache에 영향을 미칩니다. 개미 ReaderInputStream 클래스(여기), ~ 아니다 아파치 커먼즈 IO ReaderInputStream 클래스입니다.

또한 문자열로 시작하는 경우 StringReader 생성을 건너뛰고 org.apache.commons.io.IOUtils를 사용하여 한 단계로 InputStream을 생성할 수 있습니다. 커먼즈 IO 이렇게:

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

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

사용:

new CharSequenceInputStream(html, StandardCharsets.UTF_8);

이 방법을 사용하면 사전 변환이 필요하지 않습니다. String 그리고 나서 byte[], 보고서가 큰 경우 훨씬 더 많은 힙 메모리를 할당합니다.StringBuffer에서 바로 스트림을 읽을 때 즉시 바이트로 변환됩니다.

그것은 사용한다 CharSequenceInputStream Apache Commons IO 프로젝트에서.

이러한 클래스의 명확한 이름은 ReaderInputStream 및 WriterOutputStream입니다.불행하게도 이것들은 Java 라이브러리에 포함되어 있지 않습니다.하지만 구글은 당신의 친구입니다.

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

RFE가 있고, 하지만 폐쇄되어 수정되지 않습니다.

텍스트 인코딩 문제를 피할 수는 없지만 아파치 커먼즈-io 가지다

이는 Peter의 koders.com 답변에서 언급된 라이브러리이며, 소스 코드 대신 라이브러리에 대한 링크일 뿐입니다.

의 내용을 쓰려고 하시나요? ReaderOutputStream?그렇다면 포장을 더 쉽게 할 수 있을 것입니다. OutputStreamOutputStreamWriter 그리고 char에서 Reader ~로 Writer, 리더를 InputStream:

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

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

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

당신이 사용할 수있는 선인장 (정적 메소드는 없고 객체만 있음):

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

Java가 제공하는 것을 사용하여 스트림에서 문자열을 읽는 경우.

InputStream s = new BufferedInputStream( new ReaderInputStream( new StringReader("a string")));
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top