Java에서 I/O(Input/Output)는 프로그램과 외부 세계(파일, 네트워크 등) 간의 데이터 전송을 의미합니다.
Java는 다양한 I/O 작업을 수행하기 위해 여러 클래스를 제공합니다.
이 글에서는 Java I/O의 기본 개념과 함께 InputStream, OutputStream, Reader, Writer 클래스에 대해 알아보겠습니다.
Java I/O의 기본 개념
- 바이트 스트림 (Byte Stream): 바이트 단위로 데이터를 읽고 쓰는 스트림입니다.
주로 이미지, 오디오, 비디오와 같은 바이너리 데이터를 처리할 때 사용됩니다. - 문자 스트림 (Character Stream): 문자 단위로 데이터를 읽고 쓰는 스트림입니다.
주로 텍스트 파일을 처리할 때 사용됩니다.
Java에서는 InputStream과 OutputStream 클래스를 통해 바이트 스트림을, Reader와 Writer 클래스를 통해 문자 스트림을 처리합니다.
#1 InputStream 클래스
InputStream은 바이트 단위로 데이터를 읽기 위한 추상 클래스입니다.
이 클래스를 상속받아 다양한 입력 스트림을 구현할 수 있습니다.
- 주요 서브클래스
- FileInputStream: 파일에서 바이트 데이터를 읽기 위한 클래스입니다.
- BufferedInputStream: 입력 스트림을 버퍼링하여 효율적으로 데이터를 읽기 위한 클래스입니다.
- 예제
import java.io.FileInputStream;
import java.io.IOException;
public class FileInputStreamExample {
public static void main(String[] args) {
FileInputStream fis = null;
try {
fis = new FileInputStream("example.txt");
int data;
while ((data = fis.read()) != -1) {
System.out.print((char) data); // 바이트를 문자로 변환하여 출력
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (fis != null) {
fis.close(); // 스트림 닫기
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
#2 OutputStream 클래스
OutputStream은 바이트 단위로 데이터를 쓰기 위한 추상 클래스입니다.
이 클래스를 상속받아 다양한 출력 스트림을 구현할 수 있습니다.
- 주요 서브클래스
- FileOutputStream: 파일에 바이트 데이터를 쓰기 위한 클래스입니다.
- BufferedOutputStream: 출력 스트림을 버퍼링하여 효율적으로 데이터를 쓰기 위한 클래스입니다.
- 예제
import java.io.FileOutputStream;
import java.io.IOException;
public class FileOutputStreamExample {
public static void main(String[] args) {
FileOutputStream fos = null;
try {
fos = new FileOutputStream("output.txt");
String data = "Hello, World!";
fos.write(data.getBytes()); // 문자열을 바이트 배열로 변환하여 파일에 쓰기
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (fos != null) {
fos.close(); // 스트림 닫기
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
#3 Reader 클래스
Reader는 문자 단위로 데이터를 읽기 위한 추상 클래스입니다.
이 클래스를 상속받아 다양한 문자 입력 스트림을 구현할 수 있습니다.
- 주요 서브클래스
- FileReader: 파일에서 문자 데이터를 읽기 위한 클래스입니다.
- BufferedReader: 입력 스트림을 버퍼링하여 효율적으로 데이터를 읽기 위한 클래스입니다.
- 예제
import java.io.FileReader;
import java.io.BufferedReader;
import java.io.IOException;
public class FileReaderExample {
public static void main(String[] args) {
BufferedReader br = null;
try {
br = new BufferedReader(new FileReader("example.txt"));
String line;
while ((line = br.readLine()) != null) {
System.out.println(line); // 한 줄씩 출력
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (br != null) {
br.close(); // 스트림 닫기
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
#4 Writer 클래스
Writer는 문자 단위로 데이터를 쓰기 위한 추상 클래스입니다.
이 클래스를 상속받아 다양한 문자 출력 스트림을 구현할 수 있습니다.
- 주요 서브클래스
- FileWriter: 파일에 문자 데이터를 쓰기 위한 클래스입니다.
- BufferedWriter: 출력 스트림을 버퍼링하여 효율적으로 데이터를 쓰기 위한 클래스입니다.
- 예제
import java.io.FileWriter;
import java.io.BufferedWriter;
import java.io.IOException;
public class FileWriterExample {
public static void main(String[] args) {
BufferedWriter bw = null;
try {
bw = new BufferedWriter(new FileWriter("output.txt"));
bw.write("Hello, World!"); // 파일에 문자열 쓰기
bw.newLine(); // 줄 바꿈
bw.write("Java I/O Example");
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (bw != null) {
bw.close(); // 스트림 닫기
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
마무리
Java의 I/O는 다양한 데이터 전송 작업을 수행하는 데 필수적인 기능입니다.
InputStream, OutputStream, Reader, Writer 클래스는 각각 바이트 및 문자 단위의 데이터를 읽고 쓰는 데 사용됩니다.
클래스를 적절히 활용하면 파일, 네트워크 등 다양한 소스와의 데이터 통신을 효율적으로 처리할 수 있습니다.
'IT · 인터넷' 카테고리의 다른 글
[Docker] Docker와 컨테이너화 - 애플리케이션을 컨테이너화하는 방법 (1) | 2025.02.09 |
---|---|
[JAVA] 메시지 큐(Message Queue) 이해와 활용 (0) | 2025.02.07 |
[Java] 컴파일 시점과 런타임 시점 (0) | 2025.01.31 |
[Notion] 노션 사용법 및 노션 템플릿 사용법 (1) | 2025.01.28 |
[Java] ArrayIndexOutOfBoundsException: 배열 인덱스 초과 오류 (1) | 2025.01.27 |