Java에서 String을 InputStreamReader로 바꾸는 방법은 무엇입니까?


답변:


327

ByteArrayInputStream 도 트릭을 수행합니다.

InputStream is = new ByteArrayInputStream( myString.getBytes( charset ) );

그런 다음 리더로 변환하십시오.

InputStreamReader reader = new InputStreamReader(is);

3
당신은 할 수 원하는 플랫폼의 디폴트 캐릭터 세트를 상속 할 수 있습니다.
슬림

2
감사. 끝난. 플랫폼의 기본 문자셋을 감지하는 가장 좋은 방법은 무엇입니까?
귀도

5
아니면 그냥 매개 변수없이 getBytes ()를 사용하십시오 ... 논란의 여지가 없지만 기본 인코딩을 사용합니다.
Michael Borgwardt

1
ByteArrayInputStream : 이후 : JDK1.0이 클래스가 "Java 1.4 이후"라고 가정하는 사소한 이유는 없습니다. 잘못된 버전 번호는 Java 1.4가 도입 된 것처럼 특히 이상 NIO하며 동일한 버전 내에서 API와 개념적인 후속 작업을 도입하는 것은 의미가 없습니다.
Holger

61

나는 또한 아파치 커먼즈 IOUtils클래스를 발견했다 .

InputStreamReader isr = new InputStreamReader(IOUtils.toInputStream(myString));

35
문자 인코딩을 언급하지 않고 String-> byte [] 또는 그 반대로 변환하는 것은 거의 항상 버그입니다.
Joachim Sauer

1
기본 플랫폼 인코딩 및 문자열의 문자에 따라 데이터가 손실 될 수 있습니다. 인코딩 및 디코딩 작업 모두에 유니 코드 인코딩을 지정하는 것이 좋습니다. 자세한 내용은 다음을 참조하십시오 : illegalargumentexception.blogspot.com/2009/05/…
McDowell

인코딩 매개 변수가 특정 인코딩에서 바이트를 얻는 데 필요하지 않습니까? InputSTreamReader 생성자에 대해 선택하는 것과 동일한 String # getBytes 호출에 대해 동일한 인코딩을 선택하는 한 실제로 선택하는 것은 중요하지 않습니다. Joachim과 McDowell 이이 특정 사례에 잘못되었다고 확신합니다. InputStreamReader를 문자열로 감싸는 데 필요한 인코딩 지식이 없습니다.
Stijn de Witt

4
@Stijn de Witt-나는 답장을 늦었다. 그러나 나는 이것을 보았다. 기본 플랫폼 인코딩이 문자열의 코드 포인트를 지원하지 않으면 데이터가 손실됩니다. 기본 인코딩이 UTF-8이면 아무런 문제가 없습니다. Windows에서 실행중인 경우 해당 JRE는 기본적으로 기존 "ANSI"인코딩으로 설정되므로 대부분의 유니 코드 세트가 손실됩니다. 증거는 내가 게시 한 링크에 있습니다. new InputStreamReader(IOUtils.toInputStream(myString, "UTF-16"), "UTF-16")무손실 것입니다.
McDowell

hooray, 타사 라이브러리를 사용하여 하나의 라이너를 더 큰 하나의 라이너로 만듭니다. 바이트를 s로 다시 변환하기 위해 배열 String로의 쓸모없는 변환에 대해 말하지 말라 ...byte[]char
Holger


16

@Dan 과 같은 질문 -왜 StringReader가 아닌가?

InputStreamReader 여야하는 경우 :

String charset = ...; // your charset
byte[] bytes = string.getBytes(charset);
ByteArrayInputStream bais = new ByteArrayInputStream(bytes);
InputStreamReader isr = new InputStreamReader(bais);

멋지지만 두 번째 줄은byte[] bytes = charset.getBytes();
AabinGunz

1
나는 Abhishek 그렇게 생각하지 않습니다. 내 예제에서 string은 InputStreamReader를 사용하여 액세스하려는 String의 인스턴스입니다.
툴킷

3

당신은) 도착하려고 Reader밖으로 기능을 InputStreamReader, 또는 b) InputStream중 기능 InputStreamReader? 당신은 얻을 수 없습니다 b). InputStreamReader이 아닙니다 InputStream.

목적은 바이트의 소스 InputStreamReader를 취하여 InputStream바이트를 a 형식으로 문자로 디코딩하는 것 Reader입니다. 이미 데이터를 문자 (원래 문자열)로 가지고 있습니다. 문자열을 바이트로 인코딩하고 바이트를 문자로 다시 디코딩하는 것은 중복 작업입니다.

Reader소스를 사용하지 않으려면을 사용하십시오 StringReader.

InputStream(바이트 만 제공) 을 얻으려는 경우 IOUtils.toInputStream(..)여기에 다른 답변에서 제안한 아파치 공통 을 사용 하십시오.


2

당신은 Cactoos 를 시도 할 수 있습니다 :

InputStream stream = new InputStreamOf(str);

그런 다음 필요한 경우 Reader:

Reader reader = new ReaderOf(stream);
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.