Google AdSense


[Java] String을 InputStream으로.. by Sigel

String을 InputStream으로 만들어야 하는 경우가 종종 발생한다.
라이브러리가 파일이나 네트웍과 같은 곳으로부터 읽어서 처리할 수 있도록 전달인자를 InputStream으로 되어 있다. 하지만 이 파일의 내용이 DB와 같은 곳에 있다면?? DB에서 읽으면 문자열일텐데.. 이걸 다시 파일에 기록하고 InputStream을 열어서 전달하기는 좀 무리가 있다. (어쩌면 난 경험이 부족해서 이런 경우에 더 좋은 방법이 있는데 모르는 것일 수도 있다. =ㅅ=;;)

일단.. String으로 읽어서 String을 InputStream으로 바꾸는 방법을 찾아봤다. JDK 1.0에 StringBufferInputStream라는 클래스가 있지만 이 녀석은 deprecated되었다. 대신 StringReader를 사용하라고 한다. InputStream과 Reader의 차이는 InputStream은 byte 단위로 읽는 녀석이지만, Reader는 문자(character) 단위로 읽는 녀석이다. ASCII의 경우는 동일하겠지만, 유니코드가 섞여 있다면 처리 방식이 달라질 수 있다. 문자열이라는 것은 인코딩이 되어 있으니까 String은 InputStream이 아닌 Reader로 읽는 것이 맞는 말이다.


그래서 StringBufferInputStream은 말 그대로 폐기.. 또 다른 방법은.. Apache Ant 라이브러리에 있는 StringInputStream을 사용하는 방법이다. 사용 방법은 아주 간단하다. Ant를 다운받고 lib 경로 아래에 있는 ant.jar 파일을 CLASS_PATH에 넣어주고 쓰면 된다. String 문자열을 생성자에 넣어주고 객체를 생성하면 그 문자열이 InputStream 처럼 동작한다. (뭐.. 그야 InputStream을 상속받았으니까 =ㅅ=;;) 아래 예제는 LDIF 파일을 읽어서 처리하는 부분이다. LDIFReader는 InputStream을 필요로 한다.

String ldifContent = "...";
StringInputStream is = new StringInputStream(ldifContent, "UTF-8");
LDIFReader reader = new LDIFReader(is, LDAPConnection.LDAP_V3);
LDAPMessage msg = reader.readMessage();
...

소스 코드를 보니 내부적으로는 Reader를 InputStream으로 변환해주는 org.apache.tools.ant.util.ReaderInputStream을 상속받아 org.apache.tools.ant.filters.StringInputStream을 구현했다. 이거 나중에 유용하게 사용할 수도 있겠다.


그리고 이런 라이브러리가 귀찮거나 기능에 비해 거추장스럽다면.. 간단하게 byte 배열을 이용하는 방법도 있다. String을 byte 배열로 변환한 후 ByteArrayInputStream을 사용하면 된다. 위의 코드에서 InputStream을 생성해 주는 부분만 아래와 같이 바꾸자.

ByteArrayInputStream is = new ByteArrayInputStream(ldifContent.getBytes("UTF-8"));



+ 정보 출처
How do I convert string into InputStream?
Java string to inputstream
StringInputStream은 우연히 이클립스에서 Content Assist(Ctrl + space)를 통해 발견.. 호오~~

트랙백

이 글과 관련된 글 쓰기 (트랙백 보내기)
TrackbackURL : http://entireboy.egloos.com/tb/4215663 [도움말]

덧글

덧글 입력 영역