java

자바 I/O 개론

병호네 2024. 5. 14. 11:29

자바 I/O (입출력)는 데이터를 읽고 쓰는 기능을 말하며, 파일, 네트워크, 다른 프로그램 등 다양한 소스와 대상으로부터 데이터를 주고받는 데 사용됩니다. 자바의 I/O 시스템은 크게 네 가지 주요 구성 요소로 나눌 수 있습니다: 바이트 기반 스트림, 문자 기반 스트림, 버퍼링 스트림, 그리고 고수준의 스트림으로 분류할 수 있습니다.

 

사전 기반 지식

💡Stream 이라는 단어에 대해서 먼저 살펴 보자.💡

스트림(Stream)은 데이터를 순차적으로 처리하는 일련의 연속된 데이터 요소들입니다. 자바에서 스트림은 데이터의 흐름을 읽고 쓰는 데 사용되는 추상적인 개념으로, 입출력 작업을 수행할 때 데이터를 한 곳에서 다른 곳으로 이동시키는 매개체 역할을 합니다.

 

 

java.io 패키지

💡자바 I/O의 스트림 API에는 실제로 여러 인터페이스와 추상 클래스가 정의되어 있습니다.💡

 

 

1. 바이트 기반 스트림

  • InputStream / OutputStream: 이 클래스들은 데이터를 바이트 단위로 읽고 쓰는 기본적인 기능을 제공합니다. 예를 들어, **FileInputStream**과 **FileOutputStream**은 파일로부터 바이트를 읽거나 파일에 바이트를 쓰는 데 사용됩니다.

2. 문자 기반 스트림

  • Reader / Writer: 바이트 기반 스트림과 달리, 문자 기반 스트림은 문자 데이터의 입출력을 처리합니다. 이것은 인코딩 문제를 자동으로 처리하기 때문에 텍스트 데이터를 다룰 때 특히 유용합니다. **FileReader**와 **FileWriter**는 텍스트 파일을 읽고 쓸 때 사용됩니다.

3. 버퍼링 스트림

  • BufferedInputStream / BufferedOutputStream / BufferedReader / BufferedWriter: 이 스트림들은 입출력 효율을 증가시키기 위해 내부적으로 버퍼를 사용합니다. 버퍼링 스트림은 데이터를 일정량 모아 놓았다가 한 번에 처리하기 때문에 많은 작은 입출력 연산이 필요할 때 성능을 향상시킬 수 있습니다.

4. 고수준의 스트림

  • DataInputStream / DataOutputStream: 이 스트림들은 자바의 기본 데이터 타입을 쉽게 읽고 쓸 수 있게 해 줍니다. 예를 들어, 정수, 실수 등을 데이터 소스로부터 직접 읽거나 쓸 수 있습니다.
  • ObjectInputStream / ObjectOutputStream: 객체 직렬화에 사용되며, 객체를 바이트 형태로 변환하거나 바이트에서 객체를 복원하는 기능을 제공합니다.

 

스트림의 두 가지 주요 특성

1. 단방향성

스트림은 단방향으로만 데이터를 처리합니다. 즉, 입력 스트림은 데이터를 읽는 데 사용되며, 출력 스트림은 데이터를 쓰는 데 사용됩니다. 두 작업을 동시에 수행하려면 입력 스트림과 출력 스트림을 별도로 사용해야 합니다.

2. 순차적 접근

스트림은 데이터에 순차적으로 접근합니다. 이는 스트림을 통해 데이터를 처리할 때, 한 번에 하나의 데이터 요소만 처리하며, 일반적으로 한 번 처리된 데이터 요소는 다시 되돌아갈 수 없다는 의미입니다(일부 스트림은 마킹 기능을 제공하여 이러한 제한을 일부 완화합니다).

즉, 스트림은 먼저 보낸 데이터를 먼저 받는다. 또한 중간에 건너뜀 없이 연속적으로 데이터를 주고 받는다. 이 특성은 큐(Queue)의 FIFO(First In First Out) 구조와 유사하다.