개주 훈련일지/📚 코살대 교본 학습

파일 입출력

lshfood2 2025. 12. 16. 23:57

[ 자바 입출력과 스트림 ]

프로그램으로 들어오는

모든 값을 Input이라 하고,

출력되는 값을 Output이라고 한다.

 

이를 입출력(I/O)이라고도 부르며

자바에서는 입출력을 처리하기 위해

별도의 I/O 패키지를 제공한다.

 

여기서 데이터란, 자바 프로그램에서

처리할 수 있는 모든 데이터를 의미한다.

 

파일을 읽어서 / 파일을 쓴다 고 가정할 때

우선 파일에 접근하기 위한 길이 필요하고

읽어온 데이터를 쓰기 위한 길도 필요한데

 

자바 프로그래밍이 데이터를 주고받는 작업을 도와주는

통로를 '스트림(Stream)' 또는 '가상 통로' 라고 한다.


[ 입출력 스트림의 특징 ]

자바에는 입출력을 위한

입력 스트림과 출력 스트림이 있다.

 

1) InputStream 
프로그램을 기준으로 데이터가 들어옴

 

2) OutputStream
프로그램을 기준으로 데이터가 나감

 

두 기능은 동시에 진행되는 것이 아니라

각각 독립적으로 한 가지 기능만 동작하기 때문에

데이터를 교환하기 위해서는 입력 스트림과

출력 스트림이 따로 필요하다.

자바 입출력 스트림의 주요 특징
1) 
스트림은 입출력 장치와 자바 프로그램 간의
연결 통로로 스티림의 양 끝에서 전달이 이루어진다.
2)
단방향 통신이므로 입력 스트림과 출력 스트림을
별도로 사용해야 하며 FIFO 구조를 이루고 있다.
FIFO = (Firtst In Fires Out)
3)
연속된 데이터의 흐름으로 입출력 진행 시
다른 작업을 할 수 없는 상태가 된다.
4)
입출력 대상을 변경하기 편하며
동일한 프로그램 구조를 유지할 수 있다.


[ 입출력 스트림의 종류 ]

자바의 기본적인 데이터 입출력은

java.io 패키지에서 제공한다.

 

java.io 패키지는

파일 시스템의 정보를 얻기 위한 File 클래스와

데이터 입출력을 위한 스트림 클래스를 제공한다.

 

스트림은 전달 방식에 따라 바이트(byte) 기반 스트림과

문자(char) 기반 스트림으로 구분할 수 있다.

바이트 기반 스트림 문자 기반 스트림
byte 단위로 파일을 읽고 출력할 때 사용
모든 타입의 데이터 가능
문자 단위로 파일을 읽고 출력할 때 사용
문자 데이터만 가능
최상위 객체 최상위 객체
InputStream
OutputStream
Reader
Writer

[ 바이트 기반 스트림 ]

컴퓨터의 모든 데이터는 바이트(byte) 단위로

이루어져 있기 때문에 바이트 기반 스트림은

모든 타입의 데이터를 읽고 쓰는 것이 가능하다.

 

1. InputStream : 바이트 입력 스트림

바이트 기반의 입력 스트림의 최상위 클래스 객체로

해당 객체를 상속해 다양한 입력 스트림들이 존재한다.

 

▼ 바이트 입력 스트림의 계층 구조

InputStream
├─ FileInputStream          (파일)
├─ ByteArrayInputStream     (바이트 배열)
├─ FilterInputStream
│    ├─ BufferedInputStream (버퍼링)
│    └─ DataInputStream     (기본형 읽기)
└─ ObjectInputStream        (객체 읽기)

1) InputStream

→ 모든 바이트 입력 스트림의 최상위 추상 클래스

 

2) FileInputStream / ByteArrayInputStream

→ 어디에서 읽을지 결정하는 입력원(Source) 스트림
→ 파일, 메모리 등 실제 데이터 출처 담당

 

3) FilterInputStream

→ 기존 스트림에 기능을 덧씌우는 스트림
→ 버퍼링, 데이터 처리 등
→ 데코레이터 패턴

 

4) ObjectInputStream

→ 직렬화된 객체를 읽어오는 스트림
→ 객체 역직렬화 담당

 

▼ InputStream 메서드

메서드 설명
int read() 문자를 1byte씩 읽고 반환
더 이상 읽을 문자가 없으면 -1을 반환
int read(byte[] b) 매개변수로 주어진 배열에 읽은 문자를 저장하고
실제로 읽은 수만큼 반환
더 이상 읽을 문자가 없으면 -1을 반환
int read(byte[]. int offset, int len) 매개변수로 주어진 배열에 정해진 범위만큼 읽어서 저장
시작 위치(offset), 길이(len)
int available() 스트림으로부터 읽어올 수 있는 데이터의 크기를 반환
close() 스트림 사용을 종료하고 자원을 반환

 

2. FileInputStream

파일인풋스트림은 파일에서 바이트 단위로

자료를 읽어 들일 때 사용하는 스트림이다.

아래와 같이 선언하여 사용할 수 있다.

new FileInputStream(경로/파일명);
FileInputStream fis = new FileInputStream("test.txt");

매개변수로 파일명을 포함한 경로를 지정한다.

이미지, 동영상, 텍스트 등 모든 타입의 파일명을 읽어올 수 있다.

 

3. OutputStream: 바이트 출력 스트림

바이트 기반의 출력 스트림의 최상위 클래스 객체로

해당 객체를 상속해 다양한 출력 스트림들이 존재한다.

OutputStream
├─ FileOutputStream          (파일에 바이트 출력)
├─ ByteArrayOutputStream     (메모리의 바이트 배열에 출력)
├─ FilterOutputStream        (출력 기능 확장용 추상 클래스)
│    ├─ BufferedOutputStream (버퍼링 출력)
│    └─ DataOutputStream     (기본형 데이터 출력)
└─ ObjectOutputStream        (객체 출력 / 직렬화)

1) OutputStream
→ 모든 바이트 출력 스트림의 최상위 추상 클래스

2) FileOutputStream / ByteArrayOutputStream
→ 어디로 쓸지 결정하는 출력 대상(Target) 스트림
→ 파일, 메모리 등 실제 데이터 저장 위치 담당

3) FilterOutputStream
→ 기존 스트림에 기능을 덧씌우는 스트림
→ 버퍼링, 데이터형 처리 등
→ 데코레이터 패턴

4) ObjectOutputStream
→ 객체를 바이트로 변환해 저장
→ 객체 직렬화 담당

 

▼ OutputStream 메서드

메서드 설명
int write() 1byte 출력
int write(byte[] b) 매개변수로 주어진 배열에 모든 바이트 출력
int write(byte[]. int offset, int len) 매개변수로 주어진 배열에 정해진 범위만큼 읽어서 출력
시작 위치(offset), 길이(len)
void flush() 출력 버퍼에 잔류하는 모든 내용 출력
close() 스트림 사용을 종료하고 자원을 반환

 

4. FileOutputStream

파일아웃풋스트림은 아래와 같이 선언한다.

new FileOutputStream(경로/파일명, 이어쓰기 옵션);
FileOutputStream out = new FileOutputStream("write.txt", false);

파일을 쓸 때 기존 파일명이 존재하는 경우가 있는데

이 때 해당 파일의 내용을 유지한 채 이어 쓰거나

기존의 내용을 무시하고 새롭게 파일을 생성할 수 있다.

 

이어쓰기 옵션이 true면 기존 파일에 이어서 내용을 추가

false면 기존 내용을 무시하고 새로 쓰게 된다.

(기본 옵션은 false)


[ 문자 기반 스트림 ]

자바에서는 기본 자료형은 char형을 통해

문자를 저장할 수 있다.

 

1byte 단위로 처리하는 바이트 기반 스트림은

모든 파일을 다룰 수 있으나 문자를 처리하는

char형의 크기는  2byte로 별도의 처리를 하지 않으면

정상적으로 읽지 못하는 경우가 있다.

 

이 때, 문자 기반 스트림을 사용하면

간단하게 문자를 처리할 수 있다.

1) 문자 입력 스트림

2) 문자 출력 스트림

 

1. Reader: 문자 입력 스트림

문자 기반의 입력 스트림은 최상위 클래스인 Reader를

상속해 다양한 클래스를 제공한다.

Reader
├─ StringReader(문자열)
├─ CharArrayReader(문자 배열)
├─ BufferedReader(버퍼링)
└─ InputStreamReader(바이트 → 문자 변환) - FileReader(파일)

1) Reader
→ 모든 문자 입력 스트림의 최상위 추상 클래스

2) FileReader / StringReader / CharArrayReader
→ 어디에서 읽을지 결정하는 문자 입력원(Source) 스트림
→ 파일, 문자열, 문자 배열 등 실제 문자 데이터 출처 담당

3) BufferedReader
→ 기존 Reader에 기능을 덧씌우는 스트림
→ 버퍼링을 통해 문자 읽기 성능 향상
→ 데코레이터 패턴

4) InputStreamReader
→ 바이트 입력 스트림을 문자 입력 스트림으로 변환
→ 바이트 → 문자 변환 담당 (인코딩 처리)

 

▼ Reader 메서드

메서드 설명
int read() 1개의 문자를 읽고 반환
더 이상 읽을 문자가 없으면 -1을 반환
int read(char[] cbuf) 매개변수로 주어진 배열에 읽은 문자를 저장하고
실제로 읽은 수만큼 반환
더 이상 읽을 문자가 없으면 -1을 반환
int read(char[] cbuf, int offset, int len) 매개변수로 주어진 배열에 정해진 범위만큼 읽어서 저장
시작 위치(offset), 길이(len)
close() 스트림 사용을 종료하고 자원을 반환

 

 

2. Writer: 문자 출력 스트림

문자 기반의 출력 스트림은 최상위 클래스인 Writer를

상속해 다양한 클래스를 제공한다.

Writer
├─ StringWriter(문자열)
├─ CharArrayWriter(문자 배열)
├─ BufferedWriter(버퍼링)
└─ OutputStreamWriter(문자 → 바이트 변환) - FileWriter(파일)

1) Writer
→ 모든 문자 출력 스트림의 최상위 추상 클래스

2) FileWriter / StringWriter / CharArrayWriter
→ 어디로 쓸지 결정하는 문자 출력 대상(Target) 스트림
→ 파일, 문자열 버퍼, 문자 배열 등 실제 문자 저장 위치 담당

3) BufferedWriter
→ 기존 Writer에 기능을 덧씌우는 스트림
→ 버퍼링을 통해 문자 출력 성능 향상
→ 데코레이터 패턴

4) OutputStreamWriter
→ 문자 출력 스트림을 바이트 출력 스트림으로 변환
→ 문자 → 바이트 변환 담당 (인코딩 처리)

 

▼ Writer 메서드

메서드 설명
int write(char) 단일 문자 출력
int write(char[] ) 매개변수로 주어진 배열에 모든 문자 출력
int write(String) 문자열을 매개변수로 주어진 문자열 출력
int write(char[], int offset, int len) 매개변수로 주어진 배열에 정해진 범위만큼 읽어서 출력
시작 위치(offset), 길이(len)
void flush() 출력 버퍼에 잔류하는 모든 내용 출력
close() 스트림 사용을 종료하고 자원을 반환

[ 보조 스트림 ]

메모리 버퍼를 추가로 제공하여

스트림의 성능을 향상시키는 것들도 있다.

 

바이트 기반 스트림

- BufferedInputStream

- BufferedOutputStream

 

문자 기반 스트림

- BufferedReader

- BufferedWriter

 

문자 변환 보조 스트림

- InputStreamReader

- OutputStreamWriter


[ File 클래스 ]

파일이나 디렉터리의 경로 정보와 속성을 다루는 클래스
실제 파일의 내용을 읽거나 쓰지는 않음

  • 파일 존재 여부 확인
  • 파일/폴더 생성·삭제
  • 이름, 경로, 크기, 수정 시간 확인

  입출력은 스트림이 담당,
  File은 파일 정보와 관리 담당

 

파일 객체 선언 방법 

File file = new File("C:/upload/image.png"); //윈도우, 맥, 리눅스 모두 가능
File file = new File("C:\\upload\\image.png"); //윈도우에서만 가능(이스케이프 필요)

생성자의 매개변수로 파일의 경로를 받는다.

 

파일 객체 기능(메서드)

메서드 설명
boolean delete() 파일 또는 폴더 삭제(성공시 true 반환)
boolean createNewFile() 새로운 파일이나 내용이 없는 파일 생성
boolean mkdir() 경로의 계층이 여러 개 있어도
최상위 경로의 폴더만 생성
boolean mkdirs() 경로 상의 모든 폴더 생성
boolean exists() 폴더 또는 파일의 존재 여부 반환
boolean isFile() 파일 여부 반환
boolean isDirectory() 폴더 여부 반환
long length() 파일 크기 반환
boolean canWrite() 쓰기 가능한 파일 여부 반환
boolean canRead() 읽기 가능한 파일 여부 반환
String getPath() 상대 경로 반환
String getAbsolutePath() 절대 경로 반환

'개주 훈련일지 > 📚 코살대 교본 학습' 카테고리의 다른 글

SQL) 관계  (0) 2025.12.20
프로젝트 팀 조직  (1) 2025.12.18
소프트웨어 개발 비용 예측 기법  (0) 2025.12.09
스레드  (0) 2025.12.07
람다식  (0) 2025.12.06