[Lecture/Java] 09강 - java.io 패키지와 스트림

김찬미·2025년 5월 29일

9강 - java.io 패키지와 스트림

  • 입출력 스트림
  • 바이트 스트림과 캐릭터 스트림
  • 파일 입출력
  • 콘솔 입출력과 보조 스트림

✅ 입출력 스트림

Java 프로그램에서 스트림을 통해 입출력을 수행할 수 있음

  • 입력 스트림은 데이터 생산자(소스)와 프로그램을 연결
  • 출력 스트림은 프로그램과 데이터 소비자(목적지)를 연결
  • 입출력 종류(파일, 주변 장치, 네트워크 소켓 등)에 상관없이 동일한 방법을 프로그램 작성

  • 입출력에 필요한 스트림 클래스는 java.io 패키지에서 제공

🔸스트림의 정의와 특성

  • 데이터 생산자(또는 데이터 소비자)와 프로그램 사이 데이터의 흐름
  • 순서가 있는 일련의 데이터 흐름으로, 정해진 방향으로 전달되고 순차적으로 접근할 수 있음


스트림의 분류

바이트 스트림 & 캐릭터 스트림

  • 바이트 스트림: byte 단위로 데이터를 다룸
    → 관련 클래스: xxxInputStreamxxxOutputStream

  • 캐릭터 스트림: char 단위로 데이터를 다룸
    → 관련 클래스: xxxReaderxxxWriter

기본 스트림 & 보조 스트림

  • 기본 스트림: 입출력 기능을 제공하는 스트림

  • 보조 스트림: 자체적으로 입출력 기능 수행❌
    → 기본 스트림과 함께 사용되어 보조 기능을 제공하는 스트림


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형 배열 boff 위치부터 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 클래스의 주요 메소드

📁 1. 파일/디렉터리 존재 및 정보 확인

메소드설명
boolean exists()File 객체가 실제로 존재하는지 확인
boolean isDirectory()디렉터리인지 확인
boolean isFile()파일인지 확인
String getName()파일 또는 디렉터리 이름 리턴
String getPath()전체 경로 리턴
long length()파일의 크기를 바이트 단위로 리턴 (디렉터리는 0)

🛠️ 2. 파일/디렉터리 생성, 삭제

메소드설명
boolean createNewFile()새로운 파일 생성
boolean delete()파일 또는 디렉터리 삭제
boolean mkdir()마지막 디렉터리 1개 생성
boolean mkdirs()중간 경로 포함 전체 디렉터리 생성

📂 3. 디렉터리 탐색 및 경로 확인

메소드설명
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);

🔸보조 스트림의 종류

1. Buffered 스트림 (버퍼링 기능)

  • BufferedInputStream / BufferedOutputStream
  • BufferedReader / BufferedWriter

2. Java의 기본 자료형을 그대로 읽기/쓰기

  • DataInputStream, DataOutputStream

3. 다양한 출력 형식 제공

  • PrintStream, PrintWriter

4. 텍스트 파일을 라인 단위로 읽거나 라인 번호 관리

  • LineNumberReader

5. 바이트 스트림과 캐릭터 스트림의 호환

  • InputStreamReader, OutputStreamWriter

LineNumberReader 클래스

텍스트 파일을 라인 단위로 읽어 들이는 메소드를 제공

  • 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)

profile
백엔드 지망 학부생

0개의 댓글