이 글에서는 자바에서 문자열(String)을 InputStream으로 변환하는 방법을 단계별로 알아보겠습니다.
먼저 기본 개념부터 짚고 넘어가겠습니다. 문자열은 하나 이상의 문자를 포함하고 큰따옴표(" ")로 감싸진 데이터 타입입니다. InputStream 클래스는 바이트 입력 스트림을 표현하는 모든 클래스의 최상위(슈퍼) 클래스로, 파일, 네트워크, 메모리 등 다양한 소스로부터 데이터를 읽어 들일 때 사용됩니다.
변환 원리
문자열을 InputStream으로 변환할 때는 일반적으로 ByteArrayInputStream 클래스를 활용합니다. 문자열의 getBytes() 메서드로 바이트 배열을 얻은 뒤, 이를 ByteArrayInputStream 생성자에 전달하면 됩니다. 이 과정에서 문자 인코딩(예: UTF-8)을 명시적으로 지정해 주면 한글 등 멀티바이트 문자도 안전하게 처리할 수 있습니다.
다음은 실제 동작 예시입니다.
입력값
입력 문자열: Java Program
출력 결과
처음 사용 가능한 바이트 수: 12
마지막 사용 가능한 바이트 수: 10
알고리즘
- 시작
- 문자열 변수(input_string)와 InputStream 객체(input_stream)를 선언합니다.
- 문자열 값을 정의합니다.
- read() 메서드로 바이트를 읽고, available() 메서드로 읽을 수 있는 남은 바이트 수를 확인합니다.
- 결과를 화면에 출력합니다.
- 종료
예제 1: main 메서드에서 전체 로직 구현
첫 번째 예제는 모든 연산을 'main' 메서드 안에서 한 번에 처리하는 방식입니다.
import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.nio.charset.StandardCharsets;
public class Demo {
public static void main(String args[]) {
String input_string = "Java Program";
System.out.println("정의된 문자열: " + input_string);
try {
InputStream input_stream = new ByteArrayInputStream(input_string.getBytes(StandardCharsets.UTF_8));
System.out.println("처음 사용 가능한 바이트 수: " + input_stream.available());
input_stream.read();
input_stream.read();
System.out.println("마지막 사용 가능한 바이트 수: " + input_stream.available());
input_stream.close();
}
catch (Exception e) {
e.getStackTrace();
}
}
}
실행 결과
정의된 문자열: Java Program
처음 사용 가능한 바이트 수: 12
마지막 사용 가능한 바이트 수: 10
예제 2: 객체 지향 방식으로 함수 분리
두 번째 예제는 연산 로직을 별도의 함수로 분리하여 객체 지향 프로그래밍(OOP) 스타일로 구현한 것입니다. 코드의 재사용성과 가독성이 향상됩니다.
import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.nio.charset.StandardCharsets;
public class Demo {
static void check_bytes(String input_string){
try {
InputStream input_stream = new ByteArrayInputStream(input_string.getBytes(StandardCharsets.UTF_8));
System.out.println("처음 사용 가능한 바이트 수: " + input_stream.available());
input_stream.read();
input_stream.read();
System.out.println("마지막 사용 가능한 바이트 수: " + input_stream.available());
input_stream.close();
}
catch (Exception e) {
e.getStackTrace();
}
}
public static void main(String args[]) {
String input_string = "Java Program";
System.out.println("정의된 문자열: " + input_string);
check_bytes(input_string);
}
}
실행 결과
정의된 문자열: Java Program
처음 사용 가능한 바이트 수: 12
마지막 사용 가능한 바이트 수: 10
핵심 포인트 정리
- getBytes(StandardCharsets.UTF_8): 문자열을 UTF-8 인코딩의 바이트 배열로 변환합니다. 인코딩을 명시하지 않으면 플랫폼 기본 인코딩이 사용되어 환경마다 결과가 달라질 수 있으므로 반드시 지정하는 것이 좋습니다.
- available(): 스트림에서 차단 없이 즉시 읽을 수 있는(남아 있는) 바이트 수를 반환합니다. 위 예제에서 2바이트를 읽은 후 12 → 10으로 줄어든 것을 확인할 수 있습니다.
- read(): 스트림에서 다음 바이트를 하나씩 읽어 들입니다.
- close(): 스트림 사용이 끝나면 리소스 누수를 방지하기 위해 반드시 닫아야 합니다.
이처럼 ByteArrayInputStream을 활용하면 문자열을 손쉽게 InputStream으로 변환할 수 있으며, 외부 라이브러리 없이 순수 JDK API만으로 해결할 수 있다는 장점이 있습니다.