java.io 패키지와 스트림
Java프로그램에서 스트림을 통해 입출력을 수행할 수 있음
- 입력 스트림은 데이터 생산자(소스)와 프로그램을 연결
- 출력 스트림은 프로그램과 데이터 소비자(목적지)를 연결
입출력 종류(파일, 주변 장치, 네트워크 소켓 등)에 상관없이 동일한 방법을 프로그램 작성
입출력에 필요한 스트림 클래스는 java.io 패키지에서 제공

& 캐릭터 스트림바이트 스트림: byte 단위로 데이터를 다룸
→ 관련 클래스: xxxInputStream과 xxxOutputStream
캐릭터 스트림: char 단위로 데이터를 다룸
→ 관련 클래스: xxxReader과 xxxWriter
& 보조 스트림기본 스트림: 입출력 기능을 제공하는 스트림
보조 스트림: 자체적으로 입출력 기능 수행❌
→ 기본 스트림과 함께 사용되어 보조 기능을 제공하는 스트림
java.io 패키지의 스트림 클래스
프로그램에서 어떤 스트림 클래스를 사용할 것인가?
데이터 생산자와 소비자를 결정
→ 기본 스트림을 반드시 사용해야 함
보조 스트림의 유무
→ 필요하다면 기본 스트림 객체 먼저 생성
→ 기본 스트림을 감싸 보조 스트림 객체 생성
FileInputStream fis = new FileInputStream("text.txt");
BufferedInputStream bis = new BufferedInputStream(fis);
& 캐릭터 스트림InputStream 클래스바이트 단위 입력 스트림 클래스 중 최상위 추상 클래스
- 이것의 하위 클래스:
xxxInputStream
| 메소드 | 설명 |
|---|---|
abstract int read() | 입력 스트림으로부터 1바이트를 읽어 정수로 리턴함 |
int read(byte[] b) | 입력 스트림으로부터 읽어서 byte 배열에 저장하고, 읽어 들인 바이트 개수를 리턴함 |
int read(byte[] b, int off, int len) | len 바이트를 읽어서 바이트 배열의 off 위치부터 저장함 |
int abailable() | 다음 read()할 때, 블로킹 없이 입력 스트림에서 읽을 수 있는 바이트 단위의 데이터 길이 |
long skip(long n) | 입력 스트림에서 n 바이트를 건너 뜀 |
void mark(int readlimit) | 입력 스트림에서 현재 위치를 표시함 |
void reset() | mark()에서 표시된 위치로 스트림의 현재 위치를 이동 |
OutputStream 클래스바이트 단위 출력 스트림 클래스 중 최상위 추상 클래스
- 이것의 하위 클래스는
xxxOutputStream
| 메소드 | 설명 |
|---|---|
abstract void write(int b) | 1바이트 데이터를 출력 스트림에 씀 |
void write(byte[] b) | byte형 배열 b의 모든 바이트를 출력 스트림에 씀 |
void write(byte[] b, int off, int len) | byte형 배열 b의 off 위치부터 len 바이트를 출력 스트림에 씀 |
void close() | 출력 스트림을 닫고 자원을 돌려줌 |
void flush() | 출력 스트림에 남아 있는 모든 데이터를 최종 목적지로 보냄 |
Reader 클래스입력용 캐릭터 단위 스트림 클래스 중 최상위 추상 클래스
- 이것의 하위 클래스는
xxxReader
| 메소드 | 설명 |
|---|---|
int read() | 입력 스트림에서 1개 문자(2바이트)를 읽어 리턴함 |
int read(char[] cbuf) | 입력 스트림에서 문자들을 읽어 char형 배열 cbuf에 저장하고, 읽어 들인 문자의 개수를 리턴함 |
boolean ready() | 입력 스트림에 입력 데이터가 준비되었으면 ture를 리턴함 |
abstract void close() | 입력 스트림을 닫고 자원을 반환함 |
Writer 클래스출력용 캐릭터 단위 스트림 클래스 중 최상위 추상 클래스
- 이것의 하위 클래스는
xxxWriter
| 메소드 | 설명 |
|---|---|
void write(int c) | 1개의 문자(2바이트)를 출력 스트림에 씀 |
void write(char[] cbuf) | char형 배열 cbuf의 모든 문자를 출력 스트림에 씀 |
void write(String str) | 문자열 str을 출력 스트림에 씀 |
void write(String str, int off, int len) | 문자열 str에서 off 위치부터 len개의 문자를 출력 스트림에 씀 |
abstract void close() | 출력 스트림을 닫고 자원을 반환함 |
void flush() | 출력 스트림에 남아 있는 모든 데이터를 최종 목적지로 보냄 |
File 클래스파일이나 디렉터리를 표현 → 상대 또는 절대 경로(
path)를 가짐
// 생성자
File(String pathname) // pathname은 상대 경로 or 절대 경로로 표현
File myFile1 = new File("D:\\eclipse\\workspace\\Test\\src");
File myFile2 = new File("notepad.exe");
File 클래스의 주요 메소드| 메소드 | 설명 |
|---|---|
boolean exists() | File 객체가 실제로 존재하는지 확인 |
boolean isDirectory() | 디렉터리인지 확인 |
boolean isFile() | 파일인지 확인 |
String getName() | 파일 또는 디렉터리 이름 리턴 |
String getPath() | 전체 경로 리턴 |
long length() | 파일의 크기를 바이트 단위로 리턴 (디렉터리는 0) |
| 메소드 | 설명 |
|---|---|
boolean createNewFile() | 새로운 파일 생성 |
boolean delete() | 파일 또는 디렉터리 삭제 |
boolean mkdir() | 마지막 디렉터리 1개 생성 |
boolean mkdirs() | 중간 경로 포함 전체 디렉터리 생성 |
| 메소드 | 설명 |
|---|---|
String[] list() | 하위 파일/디렉터리 이름 목록 반환 (문자열 배열) |
File[] listFiles() | 하위 파일/디렉터리 목록 반환 (File 배열) |
String getParent() | 상위 디렉터리 이름 (문자열) 반환 |
File getParentFile() | 상위 디렉터리 (File 객체) 반환 |
static File[] listRoots() | 시스템 루트 디렉터리 목록 반환 |
File 클래스 예제import java.io.*;
public class Main {
public static void main(String args[]) {
File file = new File("c:\\windows");
File files[] = file.listFiles();
int i = 0;
while (i < files.length) {
System.out.print(files[i].getPath());
System.out.print("\t" + files[i].length());
i++;
}
}
}
// 결과값
c:\windows\addins 0
c:\windows\AgSetup.logs 90624
c:\windoew\AhnInst.log 2328622
... ...
RandomAccessFile 클래스랜덤 액세스 파일: 파일의 임의 위치에서 읽기 또는 쓰기 연산 지원
→ 파일을 오픈하고, 위치를 지정하고, 읽기 또는 쓰기를 함
읽고 있는 위치는 파일 포인터가 가리킴
→ 파일 포인터가 가리키는 위치부터 바이트 단위로 읽거나 쓸 수 있음
byte 단위로 읽고 쓰며, 읽거나 쓸 때 파일 포인터가 이동됨
→ 랜덤 액세스 파일을 커다란 byte 배열로 볼 수 있음
// 생성자
RandomAccessFile(File file, String mode),
RandomAccessFile(String name, String mode)
// ✔️ mode는 읽기 전용의 "r" 또는 읽기/쓰기 겸용의 "rw"
| 메소드 | 설명 |
|---|---|
int read() | 파일로부터 1바이트를 읽어 리턴함 |
int read(byte[] b) | 파일로부터 읽어 byte 배열에 저장함 |
int read(byte[] b, int off, int len) | 파일로부터 최대 len 바이트를 읽어 b 배열의 off 위치부터 저장함 |
void seek(long pos) | pos에 지정된 위치로 파일 포인터를 이동함 |
void write(byte[] b) | byte 배열의 내용을 파일에 씀 |
void write(byte[] b, int off, int len) | byte 배열에서 off 위치부터 len 바이트를 파일에 씀 |
FileInputStream & FileOutputStream 클래스파일로부터 데이터를 읽고/쓰기 위한 입력/출력용 기본 스트림
→ 바이트 단위의 입력/출력 처리 = 이미지, 오디오 파일에 유용
// `FileInputStream` 클래스 생성자
// 기존 파일과 연결된 입력 스트림 객체 생성
FileInputStream(File file)
FileInputStream(String name)
// `FileOutputStream` 클래스 생성자
// 기존 파일(없다면 생성)과 연결된 출력 스트림 객체 생성
FileOutputStream(String name)
FileOutputStream(File file, boolean append)
FileReader & FileWriter 클래스텍스트 파일을 읽거나 쓰는데 사용되는 기본 스트림
→ 문자 단위로 입력 또는 출력을 처리
// `FileReader` 클래스 생성자
FileReader(File file)
FileReader(String fileName)
// `FileWriter` 클래스 생성자
FileWriter(File file)
FileWriter(String fileName)
FileWriter(File file, boolean append)
Console 클래스콘솔 입출력을 제공하는 클래스
→ 키보드 입력과 화면 출력을 편리하게 지원
System.console()을 사용하여 콘솔 객체 생성| 메소드 | 설명 |
|---|---|
String readline() | 콘솔에서 한 라인을 읽음 |
char[ ] readPassword() | 콘솔에서 비밀번호를 읽음. 비밀번호를 입력할 때 화면에 보이지 않음 |
PrintWriter writer() | 콘솔과 연결된 PrintWriter 객체를 리턴함 |
Reader reader() | 콘솔과 연결된 Reader 객체를 리턴함 |

기본 스트림의 성능이나 편의성을 높이는 보조 기능을 제공하는 스트림
입출력 기능은 기본 스트림을 이용해야 함
기본 스트링 객체 먼저 생성한 후, 이것을 보조 스트림 객체 생성자의 인자로 이용함
FileInputStream fis = new FileInputStream("text.txt");
BufferedInputStream bis = new BufferedInputStream(fis);
BufferedInputStream / BufferedOutputStreamBufferedReader / BufferedWriterJava의 기본 자료형을 그대로 읽기/쓰기DataInputStream, DataOutputStreamPrintStream, PrintWriterLineNumberReaderInputStreamReader, OutputStreamWriterLineNumberReader 클래스텍스트 파일을 라인 단위로 읽어 들이는 메소드를 제공
BufferedReader의 서브 클래스
int read()String readLine()int getLineNumber()long skip(long)InputStreamReader 클래스바이트 입력 스트림을 캐릭터 입력 스트림으로 변환
→ 바이트 단위로 읽히는 스트림을 문자 단위로 읽을 수 있게 함
// 생성자
InputStreamReader(InputStream in, Charset cs)
int read()int read(char[] cbuf, int offset, int length)