InputStream, OutputStream 정리
2024. 5. 18. 12:59ㆍ개발노트
스트림(Stream)
스트림이란 데이터를 연속적으로 처리하는 개념이다. 데이터가 한번에 전체가 아닌, 일정한 크기 단위로 전달되거나 처리되는 것을 말하며
실시간 데이터 처리, 자원을 절약하여 효율적인 데이터 처리에 유리하다.
Java에서 사용하는 InputStream, OutputStream은 'java.io' 패키지에 속하며 파일, 네트워크 연결, 메모리 배열 등의 데이터 소스로부터 데이터를 읽거나 쓸 때 사용한다.
InputStream
바이트 단위로 데이터를 읽기 위한 추상 클래스이며 주요 메서드는 아래와 같다.
- int read() : 하나의 바이트를 읽고, 해당 바이트를 정수(0-255)로 반환한다. 더 이상 읽을 데이터가 없으면 -1을 반환한다.
- int read(byte[] b) : 바이트 배열 'b'에 데이터를 읽어 채운다. 읽은 바이트 수를 반환하며, 더 이상 읽을 데이터가 없으면 -1을 반환한다.
- int read(byte[] b, int off, int len) : 바이트 배열 'b'의 'off' 위치부터 최대 'len' 바이트를 읽어 채운다. 읽은 바이트 수를 반환하며, 더 이상 읽을 데이터가 없으면 -1을 반환한다.
- void close() : 스트림을 닫고, 사용한 리소스를 해제한다.
아래와 같이 사용한다.
import java.io.FileInputStream;
import java.io.IOException;
public class InputStreamExample {
public static void main(String[] args) {
try (InputStream inputStream = new FileInputStream("example.txt")) {
int data;
while ((data = inputStream.read()) != -1) {
System.out.print((char) data);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
OutputStream
바이트 단위로 데이터를 쓰기 위한 추상 클래스이며 주요 메서드는 아래와 같다.
- void write(int b) : 하나의 바이트를 쓴다. 입력으로 주어진 정수의 하위 8비트를 사용한다.
- void write(byte[] b) : 바이트 배열 'b'의 모든 바이트를 쓴다.
- void write(byte[] b, int off, int len) : 바이트 배열 'b'의 'off' 위치부터 'len' 바이트를 쓴다.
- void close() : 스트림을 닫고, 사용한 리소스를 해제한다.
- void flush() : 버퍼에 저장된 모든 출력 바이트를 강제롤 출력한다.
아래와 같이 사용한다.
import java.io.FileOutputStream;
import java.io.IOException;
public class OutputStreamExample {
public static void main(String[] args) {
try (OutputStream outputStream = new FileOutputStream("output.txt")) {
String data = "Hello, World!";
outputStream.write(data.getBytes());
} catch (IOException e) {
e.printStackTrace();
}
}
}
스트림 사용 시 주의점
- 자원 관리 : InputStream과 OutputStream은 시스템 리소스를 사용하므로 사용 후 반드시 닫아야 한다. 이를 위해 'try-with-resources' 구문을 사용해 자동으로 닫히게 하는 것이 좋다. (Java 7 부터 구문 사용 시 AutoCloseable 인터페이스를 구현한 객체에 대해 자원을 자동으로 반납한다.) 1
- 예외 처리 : 스트림 작업 중에는 예외가 발생할 수 있으므로 적절한 예외 처리가 필요하다.
- 버퍼링 : 성능을 향샹시키기 위해 버퍼링된 스트림(BufferedInputStream, BufferedOutputStream)을 사용하는 것이 일반적이다.
- AutoCloseable은 Java 7에서 도입된 인터페이스로, 리소스를 명시적으로 닫아야 하는 객체를 자동으로 닫을 수 있도록 해줍니다. 이 인터페이스는 java.lang 패키지에 속하며, try-with-resources 문과 함께 사용됩니다. AutoCloseable을 구현하는 클래스는 close() 메서드를 구현해야 합니다. [본문으로]