자바(JAVA)/미니 프로젝트 & 기초 공부

Java 기초 또 다시 공부하기 20일차(마지막) - 입출력 스트림(보조 스트림, 입출력 관련 API)

개발학생 2025. 7. 9. 10:33
반응형

1. 보조 스트림 (Filter Streams)

  • 기본 스트림을 감싸서 기능을 확장하는 역할
  • 입력 스트림: BufferedInputStream, DataInputStream
  • 출력 스트림: BufferedOutputStream, DataOutputStream, PrintStream
  • 단독 사용 불가 → 반드시 기본 스트림을 감싸야 함

1) BufferedInputStream / BufferedOutputStream

  • 기본 스트림(InputStream/OutputStream)을 감싸서 버퍼(buffer) 메모리를 활용하여 입출력 효율을 높이는 보조 스트림
  • 데이터가 1바이트씩 처리되는 기본 스트림의 단점(느림)을 보완하기 위해 번에 블록 단위로 처리
    ->
    디스크 I/O 최소화 → 성능 향상
  • BufferedInputStream은 내부 버퍼에 데이터를 미리 읽어두고, 프로그램이 요청할 때마다 버퍼에서 꺼냄
  • BufferedOutputStream은 출력 내용을 먼저 버퍼에 모은 뒤 일정 크기에 도달하거나 flush() 호출 시 한꺼번에 출력
  • 네트워크 스트림, 파일 입출력에서 자주 사용
  • BufferedReader/BufferedWriter의 바이트 버전

BufferedInputStream / BufferedOutputStream 예제: 자바 컴파일러 사이트

2) DataOutputStream / DataInputStream

  • 자바의 기본 데이터 타입(int, double, boolean 등)을 순서대로 스트림에 기록하거나 읽어올 수 있게 해주는 보조 스트림
  • 객체 직렬화와는 다르게, 명시적으로 타입을 기록/읽기 하므로 일관성 있는 데이터 처리에 유리
    -> CSV보다 정확한 데이터 타입 관리가 필요할 때 사용 
  • writeInt(), writeDouble(), writeUTF() 등: 데이터 타입별 저장
  • readInt(), readDouble(), readUTF() 등: 타입에 맞게 읽기
  • 네트워크로 데이터를 주고받을 때 정형화된 구조 제공

DataOutputStream / DataInputStream 예제: 자바 컴파일러 사이트

3) PrintStream

  • 자바에서 콘솔이나 파일에 편리하게 출력할 수 있도록 도와주는 출력 스트림
  • OutputStream을 확장한 보조 스트림으로, 형식화된 텍스트 출력에 특화
  • System.out도 PrintStream 객체로, print(), println(), printf() 등 다양한 출력 메서드 지원
  • 자동 flush 설정 가능 (new PrintStream(..., true))
  • 예외 발생 시 예외를 던지지 않고 자체 처리
  • 콘솔 로그 출력(System.out 자체가 PrintStream), 디버깅 정보 기록, 파일 로그 시스템, 형식 지정 출력에 사용

PrintStream 예제: 자바 컴파일러 사이트

 

2. 입출력 관련 API

1) File 

  • 파일/디렉토리의 존재 여부, 이름, 경로, 권한 등을 확인하거나 변경

File 예제: 자바 컴파일러 사이트(사이트에서 파일을 인식할 수 없으므로 파일이 없다고 뜸)

2) FileReader / FileWriter

  • 문자 기반 입출력 API
  • 텍스트 파일 읽고 쓰기에 적합

FileReader / FileWriter 예제: 자바 컴파일러 사이트

3) BufferedReader / BufferedWriter

  • 줄 단위로 텍스트를 처리할 수 있어 실무에서 많이 사용

BufferedReader / BufferedWriter 예제: 자바 컴파일러 사이트

4) RandomAccessFile

 

  • 파일을 임의 위치에서 읽고 쓸 수 있는 API
  • 대용량 로그 파일, 바이너리 파일 처리에 유용
RandomAccessFile raf = new RandomAccessFile("log.dat", "rw");
raf.seek(100); // 100번째 바이트로 이동
raf.writeUTF("개발학생 로그");

 

 

반응형