자바 입출력 (I/O) 개요
자바에서 입출력(I/O, Input/Output)은 컴퓨터 내부의 메모리와 키보드, 모니터, 파일, 네트워크 등 외부의 장치 간에 데이터를 주고받는 과정을 의미합니다. 자바의 java.io 패키지는 이러한 데이터 입출력을 일관된 방식으로 처리할 수 있는 다양한 클래스를 제공합니다.
1. 노드 스트림 (Node Stream)
자바 I/O의 핵심은 외부 데이터(파일, 네트워크 등)의 근원지(Source)나 도착지(Destination)와 직접 연결되어 데이터를 읽거나 쓰는 노드 스트림(기준 스트림) 입니다. 어떤 데이터를 다루는지에 따라 두 가지 계열로 나뉩니다.
바이트 기반 스트림
1byte 단위로 데이터를 주고받습니다. 이미지, 동영상, 텍스트 등 모든 종류의 데이터 를 전송할 수 있습니다.
최상위 추상 클래스로 InputStream과 OutputStream을 사용합니다.
FileInputStream/FileOutputStream(파일)ByteArrayInputStream/ByteArrayOutputStream(메모리)
문자 기반 스트림
자바의 char는 2byte이기 때문에 1byte 기반의 스트림으로 문자를 처리하면 한글 등이 깨질 수 있습니다. 오로지 문자 데이터(텍스트) 만을 처리하기 위해 만들어진 스트림입니다.
최상위 추상 클래스로 Reader와 Writer를 사용합니다.
FileReader/FileWriter(파일 텍스트)StringReader/StringWriter(문자열)
2. 파일 입출력 예제
가장 흔하게 사용되는 파일 읽기와 쓰기의 기본 구조입니다. 자원을 사용한 뒤에는 반드시 close()를 통해 시스템 자원을 반환해야 합니다. 자바 7부터 지원하는 try-with-resources 구문을 사용하면 자동으로 닫아줍니다.
import java.io.*;
public class FileIOExample {
public static void main(String[] args) {
// 파일에 문자열 쓰기
try (FileWriter fw = new FileWriter("test.txt")) {
fw.write("Hello, World!\n안녕하세요.");
} catch (IOException e) {
e.printStackTrace();
}
// 파일에서 문자열 읽기
try (FileReader fr = new FileReader("test.txt")) {
int data;
// 끝에 도달하면 -1을 반환함
while ((data = fr.read()) != -1) {
System.out.print((char) data);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
스트림은 단방향으로만 흐르며, 입력을 위한 스트림과 출력을 위한 스트림을 각각 따로 만들어야 합니다.