Java 바이트 스트림 (FileInputStream / FileOutputStream)
1. 바이트 스트림이란?
- 정의: 파일의 내용을 바이트 단위(0~255) 로 읽거나 쓰는 스트림
- 특징
- 알파벳, 숫자, 기호뿐만 아니라 이진데이터(이미지, 동영상 등) 도 처리 가능
- 스트림은 읽기 전용(Input) 또는 쓰기 전용(Output) 중 하나만 가능
- 프로그램과 파일 사이에 데이터를 주고받는 연결 다리(통로) 역할
2. FileInputStream
- 역할: 파일에서 데이터를 읽어오기 위한 스트림
- 생성: new FileInputStream("파일명")
- 주의점: 객체를 생성할 때 반드시 예외처리를 해야 함
- 메서드
- int read() : 1바이트 읽기 (값 범위 0~255), 파일 끝(EOF)이면 -1 반환
3. FileOutputStream
- 역할: 파일에 데이터를 쓰기 위한 스트림
- 생성: new FileOutputStream("파일명", append)
- append = false (기본값): 기존 내용을 덮어씀
- append = true : 기존 내용 뒤에 이어쓰기
- 특징: 파일이 존재하지 않으면 자동으로 생성됨
- 메서드
- write(int b) : 1바이트 쓰기 ((char) 캐스팅 없어도 문자 단위로 기록 가능)
4. 코드 예제
import java.io.*;
public class Ex03_바이트스트림 {
public static void main(String[] args) {
FileInputStream fis = null;
FileOutputStream fos = null;
try {
// 읽기용 다리
fis = new FileInputStream("from.txt");
// 쓰기용 다리 (append = true → 기존 내용 뒤에 추가)
fos = new FileOutputStream("to.txt", true);
System.out.println("파일 열기 성공!");
int r;
while (true) {
r = fis.read(); // 한 글자(1바이트)씩 읽기
if (r == -1) // 파일 끝(EOF)이면 종료
break;
System.out.print((char) r); // 콘솔에 출력
fos.write(r); // to.txt에 쓰기
}
} catch (FileNotFoundException e) {
System.out.println("from.txt 파일을 찾을 수 없습니다.");
} catch (IOException e) {
System.out.println("read() 중 예외 발생");
e.printStackTrace();
} finally {
try {
fis.close(); // 연결 다리 끊기
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
5. EOF (End Of File)
- 모든 파일 끝에는 EOF 표시가 있다.
- read() 메서드는 EOF를 만나면 -1을 반환 → 반복문 종료 조건으로 활용
6. 예외 클래스 계층
- IOException
- Exception → IOException
- 입출력 작업 중 발생하는 모든 예외의 상위 클래스
- FileNotFoundException
- IOException의 하위 클래스
- 파일이 없거나 접근 권한이 없을 때 발생
- ClassNotFoundException
- ReflectiveOperationException의 하위 클래스
- 리플렉션을 통해 클래스를 찾지 못할 때 발생 (이번 예제와 직접적 관련은 없음)
7. 정리
- FileInputStream → 파일 읽기 다리
- FileOutputStream → 파일 쓰기 다리
- read()가 -1을 반환하면 EOF 도달
- append 옵션으로 파일 덮어쓰기 / 이어쓰기 결정
- 반드시 close()로 자원 해제
👉 한 줄 요약:
바이트 스트림은 모든 종류의 데이터를 처리할 수 있는 기본 입출력 스트림으로, 파일 복사, 이미지·영상 처리 등에서 자주 사용된다.
📊 FileInputStream vs FileOutputStream 비교
| 구분 | FileInputStream | FileOutputStream |
| 역할 | 파일에서 데이터를 읽기 위한 스트림 | 파일에 데이터를 쓰기 위한 스트림 |
| 생성자 | new FileInputStream("file.txt") | new FileOutputStream("file.txt") new FileOutputStream("file.txt", true) → 이어쓰기 |
| 데이터 단위 | 1바이트(0~255) 단위로 읽음 | 1바이트(0~255) 단위로 기록 |
| 주요 메서드 | int read() → 1바이트 읽기 int read(byte[] b) → 배열에 여러 바이트 읽기 | void write(int b) → 1바이트 쓰기 void write(byte[] b) → 배열 통째로 쓰기 |
| EOF 처리 | 파일 끝에서 read()가 -1 반환 | 해당 없음 |
| 파일 처리 방식 | 파일이 없으면 예외 발생 | 파일이 없으면 자동 생성됨 |
| 덮어쓰기 / 이어쓰기 | 해당 없음 | 기본: 덮어쓰기 옵션: append=true 시 이어쓰기 |
| 적합한 용도 | 텍스트, 이미지, 동영상 등 모든 파일 읽기 | 텍스트, 이미지, 동영상 등 모든 파일 쓰기 |
| 예외 | FileNotFoundException, IOException | FileNotFoundException, IOException |
👉 이렇게 표로 보면, Input은 읽기만 / Output은 쓰기만,
그리고 Output은 파일 없으면 자동 생성 & 이어쓰기 옵션 가능이 가장 큰 차이점이에요.
'기초 및 언어 > ▶ Java&JSP' 카테고리의 다른 글
| 37. 문자 스트림 (FileReader / FileWriter / InputStreamReader) (1) | 2025.08.29 |
|---|---|
| 36. Buffer (0) | 2025.08.29 |
| 34. HashMap (1) | 2025.08.26 |
| 33. HashSet (0) | 2025.08.26 |
| 32. Vector와 Enumeration (1) | 2025.08.26 |