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"));