[Java] java.io 패키지 입출력 스트림 쉽게 이해하기

2025. 5. 28. 17:15·공부/☕Java

✅ 1. 스트림(Stream)이란?

  • 데이터가 한쪽에서 다른 쪽으로 연속적으로 흐르는 통로를 의미한며, 데이터의 흐름을 추상화한 객체가 Stream임.
  • 쉽게말해, Stream은 수도관 데이터는 그 안에서 흐르는 물과 같은 느낌이고, 개발자가 수도꼭지를 틀거나 잠그는 역할임.
  • 데이터를 바이트 단위로 입출력하기 위한 통로라고 생각하면 된다.
  • 자바에서 모든 IO 기반 통신은 스트림 기반으로 만들어져 있음. ( 네트워크, HTTP, 파일, 콘솔 등 )

✅ 2. 스트림(Stream) 종류

  • 크게 기본 입력 스트림, 출력 스트림이 있으며 각각 기본 스트림과 보조 스트림을 제공해준다.
  • 기본, 보조 스트림 내부에서는 바이트 스트림, 문자 스트림으로 또 나누어지게 된다.

(1) 기본 스트림

  • Java I/O에서 입출력을 처리하는 가장 기본적은 스트림 클래스를 의미한다.
  • 즉, 입출력 처리를 위한 기능을 모두 가지고 있다고 보면됨.

[1] 바이트 스트림

  • 기반 클래스: InputStream(입력), OutputStream(출력)을 구현한 클래스를 의미함.
  • 처리 단위: 1바이트(8비트) 단위로 처리가 됨.
  • 텍스트가 아닌 이미지, 오디오, 비디오, PDF, 이진 파일 등을 처리할 때 사용을 하는 스트림임

[2] 문자 스트림

  • 기반 클래스: Reader, Writer -> 구현한 FileReader, FileWriter 등이있음.
  • 처리 단위: 2바이트(16비트, UTF-16 기반) 
  • 사용 예시: 텍스트 파일, 문서 등 문자 기반 데이터 처리

 

(2) 보조 스트림

  • 자체적으로 입출력 기능을 수행할 수 없지만, 기본 스트림과 함께 사용되는 보조 기능을 제공한다.
  • 쉽게말해, 기본 스트림을 감싸서 기능을 확장하는 스트림을 의미함.

  • 보조 스트림은 내부에 버퍼를 사용해서 여러 데이터를 한 번에 처리해 기본 스트림의 성능을 올려줄 수 있음.
  • 보조 스트림은 readLine(), writeInt() 등 고급 기능을 제공을 해줌.

✅ 3. InputStream 클래스 ( 바이트 스트림 )

  • 바이트 단위 입력 스트림 클래스 중 최상위 추상 클래스이다.
  • 이것의 하위 클래스는 xxxInputStream 임.
  • 쉽게말해, 파일을 읽어들이는 역할이라고 보면 됨. 입력

(1) abstract int read()

  • 입력 스트림으로부터 1바이트를 읽어 정수로 리턴을 하는 추상 메서드이다.
  • InputStream 클래스 내부의 추상 메서드로 되어있으며, 구현체들은 해당 read() 메서드를 구현하고 있음.

(2) int read(byte[] b)

  • 한 바이트가 아닌, 여러 바이트를 읽을 수 있는 메서드이다.
  • 입력 스트림으로부터 읽어서 byte 배열에 저장하고, 읽어 들인 바이트 개수를 리턴함.

(2) int read(byte[] b, int off, int len)

  • len 바이트를 읽어서 바이트 배열의 off 위치부터 저장함.

✅ 4. OutputStream 클래스 ( 바이트 스트림 )

  • 바이트 단위 출력 스트림 클래스 중 최상위 추상 클래스이다.
  • 이것의 하위 클래스는 xxxOutputStream
  • 출력 스트림으로부터 1바이트를 읽어 정수로 리턴을 하는 추상 메서드이다.
  • 바이트 기반 출력 스트림의 최상위 추상 클래스임.
  • 파일, 네트워크, 메모리 등 외부로 출력할 때 사용하는 기본 클래스임.
  • 쉽게말해, 텍스트 파일에 접근해서 텍스트를 넣기 위한 클래스임.

(1) abstract void write(int b)

  • 출력 스트림으로부터 1바이트를 읽어 정수로 리턴을 하는 추상 메서드이다.

(2) void write(byte[] b)

  • byte형 배열 b의 모든 바이트를 출력 스트림에 씀

(3) void write(byte[] b, int off, int len)

  • byte형 배열 b의 off 위치부터 len 바이트를 출력 스트림에 씀

(4) void close()

  • 출력 스트림을 닫고 자원을 돌려줌

(5) void flush()

  • 출력 스트림에 남아 있는 모든 데이터를 최종 목적지로 보냄
  • 보통은 출력을 할 때 메모리의 버퍼에 저장을 하는데 거기 내부의 남아 있는 내용을 보내줌.

✅ 5. Reader 클래스

  • 입력용 캐릭터 단위 스트림 클래스 중 최상위 추상 클래스
  • 이것의 하위 클래스는 xxxReader
  • FileReader: 문자 단위로 처리를 해주며, 한글도 잘 나옴 ( 2바이트 문자 단위로 읽음)
  • 반면, FileInputStream은 1바이트(0~255) 단위로 읽음.
  • 텍스트를 다룰 땐 FileReader가 적합함.

(1) int read()

  • 입력 스트림에서 1개 문자(2바이트)를 읽어 리턴함

(2) int read(char[] cbuf)

  • 입력 스트림에서 문자들을 읽어 char 형 배열 cbuf에 저장하고, 읽어 들인 문자의 개수를 리턴함

(3) boolean ready()

  • 입력 스트림에 입력 데이터가 준비되었으면 true를 리턴함

(4) abstract void close()

  • 입력 스트림을 닫고 자원을 반환함.

✅ 6. Writer 클래스

  • 출력용 캐릭터 단위 스트림 클래스 중 최상위 추상 클래스
  • 이것의 하위 클래스는 xxxWriter
  • FileWriter: 문자 단위로 처리를 해주며, 한글도 잘 나옴 ( 2바이트 문자 단위로 출력 )
  • 반면, FileOutputStream은 1바이트(0~255) 단위로 출력함. ( 즉, 쓰기 작업을 함 )
  • 텍스트를 다룰 땐 FileWriter가 적합함.

✅ 7. 파일 입출력

(1) File 클래스

File file1 = new File("C:/example/test.txt");
File file2 = new File("C:/example", "test.txt");
File file3 = new File(new File("C:/example"), "test.txt");
  • 파일이나 디렉터리를 표현하는 클래스로, 상대 또는 절대 경로(path)를 가짐
  • java.io 패키지에 속하며, 파일과 디렉토리를 추상화해서 다룰 수 있도록 해주는 클래스이다.
  • 실제로 파일의 내용을 읽거나 쓰는 기능은 없음. 즉, 입출력 메소드는 제공되지 않음.
  • 파일이나 디렉토리의 경로, 이름, 속성, 존재 여부 등을 확인하거나 조작하는 데 사용이 됨.
  • 운영체제의 파일 정보를 가지고 와서 읽는 것이라 별도의 스트림을 필요하지 않음.
  • 해당 파일 클래스는 파일 메타데이터를 운영체제로 부터 받아와서 제공을 해주는 것임.
  • 파일 메타데이터는 운영체제(OS)의 파일 시스템이 따로 관리하므로,
    → Java의 File 클래스만으로도 접근 가능
  • 파일 데이터는 하드디스크/SSD에 실제로 저장되어 있으므로,
    → 이걸 읽거나 쓰기 위해선 운영체제의 저수준 I/O 기능을 이용하는 스트림이 필요


✅ 8. RandomAccessFile 클래스

  • RandomAccessFile은 파일의 어느 위치에서든 읽고 쓸 수 있는 입출력 클래스임.
  • 일반적인 FileInputStream / FileOutputStream은 순차적으로 읽고 씀
  • RandomAccessFile은 **임의 위치(오프셋)**로 이동하여 파일을 조작할 수 있다는 점이 다름.
  • 파일의 임의 위치에서 읽기 또는 쓰기 연산을 지원을 해줌.
  • 파일을 오픈하고, 위치를 지정하고, 읽기 또는 쓰기를 함
  • 읽고 쓰는 위치는 파일 포인터가 가리킴
  • 파일 포인터가 가리키는 위치부터 바이트 단위로 읽거나 쓸 수 있음.
  • byte 단위로 읽고 쓰며, 읽거나 쓸 때 파일 포인터가 이동됨
  • 랜덤 엑세스 파일을 커다란 byte 배열로 볼 수 있음.

✅ 9. FileInputStream & FileOutputStream 클래스

  • 파일로부터 데이터를 읽기/쓰기 위한 입출력용 기본 스트림이다.
  • 바이트 단위의 입출력을 처리하므로 이미지나 오디오 파일과 같은 이진 파일을 다룰 때 유용함.
  • 즉, txt 처럼 텍스트 파일을 처리하기에는 부족함이 많음. ( 한글이 안된다던가 그런거 )

✅ 10. FileReader & FileWriter 클래스

  • 텍스트 파일을 읽거나 쓰는데 사용되는 기본 스트림이며, 문자 데이터를 입출력 할 때 사용이 됨.
  • 문자 단위로 처리를 해주며, 한글도 잘 나옴 ( 2바이트 문자 단위로 읽음)

✅ 11. 콘솔 입출력과 보조 스트림

(1) Console 클래스

  • 콘솔 입출력을 제공하는 클래스이다.
  • 키보드 입력과 화면 출력을 편리하게 지원을 함.
  • 명령 프롬프트 창과 같은 콜솔 환경에서 사용자와의 상호작용을 지원함. ( 즉, IDE에서는 지원을 안하는 듯 )
  • System.console()을 사용하여 콘솔 객체를 생성함.

(2) 보조 스트림

FileInputStream fis = new FileInputStream("text.txt");
BufferedInputStream bis = new BufferedInputStream(fis);
  • 기본 스트림의 성능이나 편의성을 높이는 보조 기능을 제공하는 스트림이다.
  • 입출력 기능은 기본 스트림이 필수요소이고, 해당 기본 스트림을 생성하고 이후 보조 스트림을 생성하는 구조임.
  • 즉, 보조 스트림을 생성자 인자로 기본 스트림을 생성해서 넣어줘야함.

(3) 보조 스트림 종류

[1] 버퍼링 기능 제공

  • BufferedInputStream, BufferedOutputStream, BufferedReader, BufferedWriter

[2] Java의 기본 자료형을 그대로 읽기/쓰기 위한 기능 제공

  • DataInputStream, DataOutputStream

[3] 다양한 출력 형식의 제공

  • PrintStream, PrintWriter

[4] 텍스트 파일을 라인 단위로 읽거나 라인 번호를 관리하는 메소드 제공

  • LineNumberReader
  • BufferedReader의 서브 클래스이다.
  • 텍스트 파일을 라인 단위로 읽어 들이는 메소드를 제공한다.

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

  • InputStreamReader, OutputStreamWriter
  • 바이트 단위로 읽히는 스트림을 문자 단위로 읽을 수 있게 함.
  • 특정 문자인코딩을 사용하여 변환할 수 있음
  • 생성자는 InputStreamReader(InputStream in, Charset cs)
  • 즉, new InputStreamReader(System.in, "euc-kr"); 형식으로 만듬 String 또는 Charset 으로 넘길 수 있음.
  • 이렇게하면, read() 메서드를 통해 문자를 읽을 수 있음. 즉, 1바이트로 읽고 인코딩해서 출력해주는 것임.
  • 즉, 1바이트씩 읽고 → 지정한 문자 인코딩으로 해석해서 → 문자(char)로 변환해줌.

'공부 > ☕Java' 카테고리의 다른 글

[Java] 컬렉션 프레임워크 정리: List, Set, Map 인터페이스와 대표 구현체 총정리  (0) 2025.05.30
[Java] java.nio 사용법 | Path, Files, FileChannel 예제 모음  (3) 2025.05.30
[Java] java.lang 패키지 정리: Object, String, Math 클래스 총정리  (0) 2025.05.26
[Java] 자바 함수형 인터페이스와 람다식(Lambda Expression) 쉽게 배우기  (1) 2025.05.23
[Java] 제네릭(Generic) 문법 정리: 클래스, 메서드, 제한까지  (0) 2025.05.23
'공부/☕Java' 카테고리의 다른 글
  • [Java] 컬렉션 프레임워크 정리: List, Set, Map 인터페이스와 대표 구현체 총정리
  • [Java] java.nio 사용법 | Path, Files, FileChannel 예제 모음
  • [Java] java.lang 패키지 정리: Object, String, Math 클래스 총정리
  • [Java] 자바 함수형 인터페이스와 람다식(Lambda Expression) 쉽게 배우기
junbin2
junbin2
java.lang.NullPointerException
  • junbin2
    bin's Development Diary
    junbin2
  • 전체
    오늘
    어제
    • 전체보기 (233)
      • 방송통신대학교 (87)
        • ⚙️컴퓨터의 이해 (11)
        • 💻컴퓨터과학 개론 (15)
        • 🔢자료구조 (14)
        • 🧬알고리즘 (10)
        • ⚙️운영체제 (14)
        • 🕸️이산수학 (11)
        • 🌍유비쿼터스 컴퓨팅 (11)
        • 🖥️컴퓨터과학과 (1)
      • 공부 (72)
        • 📚백엔드 공부 (6)
        • ☕Java (23)
        • 🌳Spring (13)
        • ⚙️C (12)
        • ⚡Python (15)
        • JavaScript (1)
        • 🛢️Database (0)
        • Algorithm Problem Solving (2)
      • 네트워크 (7)
        • 📜HTTP (7)
      • 스파르타코딩클럽 (64)
      • 정보 (2)
      • 정리가 필요한 글 (1)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

    • GitHub
  • 공지사항

  • 인기 글

  • 태그

    유비쿼터스
    컴퓨터의 이해
    방통대
    방송통신대학교
    C언어
    함수
    방송대
    자바
    파이썬
    자료구조
    Python
    알고리즘
    그래프
    컴퓨터과학 개론
    배열
    Java
    운영체제
    spring
    컴퓨터과학과
    이산수학
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.1
junbin2
[Java] java.io 패키지 입출력 스트림 쉽게 이해하기
상단으로

티스토리툴바