노승현
자바 입출력과 스트림 본문
입출력 스트림은 데이터를 읽거나 쓰는 데 사용되는 추상화된 개념으로, 자바에서는 java.io 패키지를 통해 제공됩니다. 여기서는 입출력 스트림의 주요 특징에 대해 알려드리겠습니다.
1. 입출력 스트림의 종류:
- 입력 스트림 (Input Stream): 데이터를 읽어들이는 스트림. InputStream 클래스와 그 하위 클래스들이 제공됩니다.
- 출력 스트림 (Output Stream): 데이터를 출력하는 스트림. OutputStream 클래스와 하위 클래스들이 있습니다.
2. 바이트 기반 스트림과 문자 기반 스트림:
- 바이트 기반 스트림 (Byte Streams): 바이트 단위로 데이터를 처리하는 스트림. InputStream 및 OutputStream의 하위 클래스들이 여기에 속합니다.
- 문자 기반 스트림 (Character Streams): 문자 단위로 데이터를 처리하는 스트림. Reader 및 Writer의 하위 클래스들이 여기에 속합니다. 문자 스트림은 유니코드 문자를 처리할 수 있습니다.
3. 스트림의 계층 구조:
- 입출력 스트림은 계층 구조를 가집니다. 기본적인 스트림들은 다양한 기능을 제공하는 데, 이들을 조합하여 복잡한 작업을 수행할 수 있습니다.
- 계층 구조를 이용하면 필요에 따라 입출력 스트림을 조합하여 사용할 수 있습니다.
4. 버퍼링 (Buffering):
- 버퍼를 사용하여 데이터를 효율적으로 처리할 수 있습니다. 버퍼는 입출력 속도를 향상시키기 위해 사용됩니다.
- BufferedInputStream, BufferedOutputStream, BufferedReader, BufferedWriter 등의 클래스가 버퍼링을 제공합니다.
5. 자동 닫힘 (AutoCloseable):
- Java 7 이상에서는 AutoCloseable 인터페이스를 구현한 자원을 사용할 때 try-with-resources 문을 사용하여 자동으로 리소스를 닫을 수 있습니다.
try (InputStream is = new FileInputStream("file.txt")) {
// 작업 수행
} catch (IOException e) {
e.printStackTrace();
}
6. 스트림 체인 (Stream Chaining):
- 여러 스트림을 연결하여 사용할 수 있습니다. 이를 통해 데이터의 변환, 필터링, 압축 등 다양한 작업을 수행할 수 있습니다.
try (BufferedReader reader = new BufferedReader(new FileReader("file.txt"))) {
String line = reader.readLine();
// 작업 수행
} catch (IOException e) {
e.printStackTrace();
}
7. 예외 처리:
- 입출력 작업은 예외를 일으키기 쉽기 때문에 예외 처리가 중요합니다. 주로 IOException과 그 하위 예외들을 처리합니다.
try {
// 입출력 작업 수행
} catch (IOException e) {
e.printStackTrace();
}
입출력 스트림은 자바에서 데이터의 효율적인 처리를 위해 필수적인 도구이며, 파일, 네트워크, 키보드 등 다양한 소스와의 데이터 입출력에 활용됩니다.
입출력 스트림의 종류
입출력 스트림은 데이터를 읽거나 쓰는 데 사용되는 Java의 기본적인 I/O 클래스들을 나타냅니다. Java의 I/O 클래스들은 java.io 패키지에 속해 있습니다. 이 패키지에서 제공하는 스트림 클래스들은 다양한 종류의 데이터 소스와 대상으로부터 데이터를 읽고 쓸 수 있도록 도와줍니다. 아래는 주요한 입출력 스트림의 종류에 대한 간단한 설명입니다:
1. 바이트 기반 입력 스트림 (Byte Input Streams):
- InputStream 클래스: 바이트 기반 입력 스트림의 최상위 클래스입니다.
- FileInputStream: 파일에서 바이트 단위로 데이터를 읽습니다.
- ByteArrayInputStream: 바이트 배열에서 데이터를 읽습니다.
- BufferedInputStream: 버퍼를 사용하여 입출력 성능을 향상시킵니다.
2. 바이트 기반 출력 스트림 (Byte Output Streams):
- OutputStream 클래스: 바이트 기반 출력 스트림의 최상위 클래스입니다.
- FileOutputStream: 파일에 바이트 단위로 데이터를 씁니다.
- ByteArrayOutputStream: 바이트 배열에 데이터를 씁니다.
- BufferedOutputStream: 버퍼를 사용하여 입출력 성능을 향상시킵니다.
3. 문자 기반 입력 스트림 (Character Input Streams):
- Reader 클래스: 문자 기반 입력 스트림의 최상위 클래스입니다.
- FileReader: 파일에서 문자 단위로 데이터를 읽습니다.
- StringReader: 문자열에서 데이터를 읽습니다.
- BufferedReader: 버퍼를 사용하여 문자 기반의 입력 성능을 향상시킵니다.
4. 문자 기반 출력 스트림 (Character Output Streams):
- Writer 클래스: 문자 기반 출력 스트림의 최상위 클래스입니다.
- FileWriter: 파일에 문자 단위로 데이터를 씁니다.
- StringWriter: 문자열에 데이터를 씁니다.
- BufferedWriter: 버퍼를 사용하여 문자 기반의 출력 성능을 향상시킵니다.
5. 객체 입출력 스트림 (Object Input/Output Streams):
- ObjectInputStream: 객체를 읽어들이는 데 사용됩니다. 주로 객체를 직렬화할 때 활용됩니다.
- ObjectOutputStream: 객체를 쓰는 데 사용됩니다. 직렬화된 객체를 파일이나 네트워크를 통해 전송할 때 사용합니다.
6. 기타 입출력 스트림:
- DataInputStream 및 DataOutputStream: 원시 데이터 타입(primitive data types)을 읽고 쓰는 데 사용됩니다.
- SequenceInputStream: 여러 입력 스트림을 하나의 스트림으로 연결하여 사용합니다.
이러한 입출력 스트림들은 데이터의 소스와 대상에 따라 선택하여 사용할 수 있으며, 프로그램의 입출력 작업을 지원하는데 필요한 다양한 기능을 제공합니다.
바이트 기반 스트림은 데이터를 바이트 단위로 읽고 쓰는 스트림입니다. Java의 java.io 패키지에서는 바이트 기반 스트림을 다루기 위한 여러 클래스가 제공되고 있습니다. 이러한 클래스들은 주로 파일, 네트워크, 메모리 등과 같은 바이트 기반의 데이터 소스 및 대상에 사용됩니다.
주요한 바이트 기반 스트림 클래스들은 다음과 같습니다:
1. InputStream 클래스:
- 바이트 기반 입력 스트림의 최상위 클래스입니다.
- 주요 하위 클래스로는 FileInputStream, ByteArrayInputStream, BufferedInputStream 등이 있습니다.
InputStream inputStream = new FileInputStream("example.txt");
2. FileInputStream 클래스:
- 파일에서 바이트 단위로 데이터를 읽는 데 사용됩니다.
FileInputStream fileInputStream = new FileInputStream("example.txt");
3. ByteArrayInputStream 클래스:
- 바이트 배열에서 데이터를 읽는 데 사용됩니다.
byte[] data = { 65, 66, 67, 68 };
ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(data);
4. BufferedInputStream 클래스:
- 버퍼를 사용하여 입출력 성능을 향상시키는 데 사용됩니다.
InputStream inputStream = new FileInputStream("example.txt");
BufferedInputStream bufferedInputStream = new BufferedInputStream(inputStream);
5. OutputStream 클래스:
- 바이트 기반 출력 스트림의 최상위 클래스입니다.
- 주요 하위 클래스로는 FileOutputStream, ByteArrayOutputStream, BufferedOutputStream 등이 있습니다.
OutputStream outputStream = new FileOutputStream("output.txt");
6. FileOutputStream 클래스:
- 파일에 바이트 단위로 데이터를 쓰는 데 사용됩니다.
FileOutputStream fileOutputStream = new FileOutputStream("output.txt");
7. ByteArrayOutputStream 클래스:
- 바이트 배열에 데이터를 쓰는 데 사용됩니다.
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
8. BufferedOutputStream 클래스:
- 버퍼를 사용하여 입출력 성능을 향상시키는 데 사용됩니다.
OutputStream outputStream = new FileOutputStream("output.txt");
BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(outputStream);
바이트 기반 스트림은 파일에서 데이터를 읽거나 쓰는 등 다양한 입출력 작업을 수행할 때 활용됩니다. 이러한 스트림들은 데이터를 바이트 단위로 처리하므로 텍스트 파일, 이미지, 오디오, 비디오 등 모든 종류의 데이터를 다룰 수 있습니다.
Reader 클래스:
- 문자 기반 입력 스트림의 최상위 클래스입니다.
- 주요 하위 클래스로는 FileReader, StringReader, BufferedReader 등이 있습니다.
Reader reader = new FileReader("example.txt");
FileReader 클래스:
- 파일에서 문자 단위로 데이터를 읽는 데 사용됩니다.
FileReader fileReader = new FileReader("example.txt");
BufferedReader 클래스:
- 버퍼를 사용하여 문자 기반의 입력 성능을 향상시키는 데 사용됩니다.
Reader reader = new FileReader("example.txt");
BufferedReader bufferedReader = new BufferedReader(reader);
Writer 클래스:
- 문자 기반 출력 스트림의 최상위 클래스입니다.
- 주요 하위 클래스로는 FileWriter, StringWriter, BufferedWriter 등이 있습니다.
Writer writer = new FileWriter("output.txt");
FileWriter 클래스:
- 파일에 문자 단위로 데이터를 쓰는 데 사용됩니다.
FileWriter fileWriter = new FileWriter("output.txt");
보조 스트림
보조 스트림(Decorator Stream)은 다른 스트림을 감싸고, 추가적인 기능을 제공하는 스트림입니다. 이러한 스트림은 기본 스트림(기반 스트림) 위에 놓여져서 입출력의 성능을 향상하거나 다양한 기능을 제공합니다. 자바에서는 java.io 패키지에서 다양한 보조 스트림을 제공하고 있습니다.
1. 보조스트림 연결하기
보조 스트림 변수명 = new 보조 스트림(기반 스트림);