1. 자바 IO 시스템 개요
1.1 '모든 것은 스트림이다'
- 유닉스/리눅스는 "모든 것은 파일이다"라는 철학을 가지고 있습니다.
- 자바의 IO 시스템은 이러한 자원들(파일, 콘솔, 네트워크 등)에 대한 접근 방식으로 '스트림'이라는 추상화된 인터페이스를 제공합니다.
- 이를 통해:
- 모든 입출력을 일관된 방식으로 처리할 수 있습니다. 예를 들어 파일에서 읽든, 네트워크에서 읽든 동일한 read() 메서드를 사용합니다.
- 스트림은 데이터가 흐르는 단방향 통로로서, 입력(InputStream)과 출력(OutputStream)이 명확히 구분됩니다.
- 개발자는 데이터의 출처나 목적지의 실제 구현 방식을 알 필요 없이, 스트림 인터페이스만을 통해 프로그래밍할 수 있습니다.
1.2 자바 IO의 핵심 개념
- 스트림(Stream): 데이터가 단방향으로 흐르는 통로
- 입력 스트림: 프로그램으로 데이터가 들어오는 통로
- 출력 스트림: 프로그램에서 데이터가 나가는 통로
- 버퍼: 데이터를 임시 저장하는 메모리 영역
2. 스트림의 기본 구조
2.1 스트림의 종류
- 처리 단위에 따른 분류
- 바이트 스트림: 모든 종류의 데이터 처리 (InputStream/OutputStream)
- 문자 스트림: 텍스트 데이터 특화 처리 (Reader/Writer)
- 기능에 따른 분류
- 기본 스트림: 데이터의 입출력을 담당
- 보조 스트림: 기본 스트림에 추가 기능을 제공
[데이터 소스] <-> [기본 스트림] <-> [보조 스트림] <-> [프로그램]
2.2 주요 스트림 클래스 계층도
InputStream (바이트 입력) OutputStream (바이트 출력)
├── FileInputStream ├── FileOutputStream
├── ByteArrayInputStream ├── ByteArrayOutputStream
└── SocketInputStream └── SocketOutputStream
Reader (문자 입력) Writer (문자 출력)
├── FileReader ├── FileWriter
├── BufferedReader ├── BufferedWriter
└── InputStreamReader └── OutputStreamWriter
3. 파일 시스템 접근
3.1 File 클래스
- File 클래스는 파일 시스템의 파일과 디렉토리를 표현합니다
// 파일 생성
File file = new File("data.txt");
boolean created = file.createNewFile();
// 디렉토리 생성
File dir = new File("data");
boolean created = dir.mkdir();
// 파일 정보 확인
boolean exists = file.exists();
long length = file.length();
boolean isDir = file.isDirectory();
3.2 파일 입출력
// 파일 읽기
try (FileInputStream fis = new FileInputStream("input.txt")) {
byte[] buffer = new byte[1024];
int length;
while ((length = fis.read(buffer)) > 0) {
// 데이터 처리
}
}
// 파일 쓰기
try (FileOutputStream fos = new FileOutputStream("output.txt")) {
String data = "Hello, World!";
fos.write(data.getBytes());
}
- new FileInputStream()
- 파일에서 데이터를 입력받는 스트림입니다.
- 파일이 없으면 예외가 발생하므로 파일이 있는지 먼저 확인해야 합니다.
- new FileOutputStream()
- 파일에 데이터를 출력하는 스트림입니다.
- 파일이 없으면 파일을 자동으로 만들고, 데이터를 해당 파일에 저장합니다.
- 폴더를 만들지는 않기 때문에 폴더는 미리 만들어두어야 합니다.
4. 콘솔 입출력
- 콘솔 입출력도 결국은 스트림을 통한 입출력입니다.
- 자바는 프로그램 시작 시 자동으로 세 가지 표준 스트림을 생성합니다
- 표준 입력(stdin): System.in (InputStream)
- 표준 출력(stdout): System.out (PrintStream)
- 표준 에러(stderr): System.err (PrintStream)
- System.in은 키보드 입력을 받는 InputStream입니다
- System.out과 System.err는 콘솔에 출력하는 PrintStream입니다
- PrintStream은 OutputStream을 상속받아 더 편리한 출력 메서드(print(), println() 등)를 제공합니다
- 파일 입출력과 마찬가지로 바이트 단위로 데이터를 주고받습니다.