Languages/Java

[HUFS/객체지향프로그래밍] #13 입출력 스트림

성중 2023. 1. 10. 16:20

입출력 스트림

입출력 스트림

  • 스트림(Stream): 자바의 데이터 입출력 흐름으로, 스트림 방향에 따라 종류 결정
  • 바이트 기반 스트림: 그림, 멀티미디어 등의 바이너리 데이터를 읽고 출력
  • 문자 기반 스트림: 문자 데이터를 읽고 출력

 

최상위 클래스로 스트림의 바이트/문자 기반 여부 판단

바이트 기반 스트림

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

 

모든 바이트 기반 출력 스트림 클래스는 OutputStream 클래스를 상속
매개 변수로 주어지는 int(4byte)에서 끝 1byte만 출력 스트림으로 보내는 write(int b) 메소드
매개 값 배열의 모든 바이트를 출력 스트림으로 보내는 write(byte[] b) 메소드
매개 값 배열의 b[off] 부터 len 개의 바이트를 보내는 write(byte[] b, int off, int len) 메소드

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

 

모든 바이트 기반 입력 스트림 클래스는 InputStream 클래스를 상속
입력 스트림으로부터 1byte를 읽고 int(4byte) 타입으로 반환하는 read() 메소드

  • 반환된 4byte 중 마지막 1byte에만 데이터 포함
  • 입력 스트림으로부터 바이트를 더 읽을 수 없다면 -1 반환
  • 읽을 수 있는 마지막 바이트까지 반복해 1byte씩 읽기 가능

 

주어진 배열의 길이만큼 바이트를 읽고 해당 배열에 저장해 반환하는 read(byte[] b) 메소드
주어진 배열의 b[off] 부터 len개 까지 저장해 반환하는 read(byte[] b, int off, int len) 메소드

문자 기반 스트림

1. 문자 출력 스트림: Writer

 

모든 문자 기반 출력 스트림 클래스는 Writer 클래스를 상속
매개 변수의 int(4byte)에서 끝 2byte(1개 문자)만 출력 스트림으로 보내는 writer(int c) 메소드
매개 값 char[] 배열의 모든 문자를 출력 스트림으로 보내는 write(char[] cbuf) 메소드
매개 값 배열의 char[off] 부터 len 개의 문자를 보내는 write(char[] cbuf, int off, int len) 메소드
문자열 전체 write(String str) / off 순번부터 len개 write(String str, int off, int len) 메소드

2. 문자열 입력 스트림: Reader

 

모든 문자 기반 입력 스트림 클래스는 Reader 클래스를 상속
입력 스트림으로부터 1개의 문자(2byte)를 읽고 int(4byte) 타입으로 반환하는 read() 메소드

  • 반환된 4byte 중 마지막 2byte에 데이터 포함
  • 반환된 int 값을 char 타입으로 변환해 문자 얻기 가능
  • 입력 스트림으로부터 문자를 더 이상 읽을 수 없다면 -1 반환
  • 읽을 수 있는 마지막 문자까지 반복해 한 문자 씩 읽기 가능

 

배열의 길이만큼 문자를 읽고 해당 배열에 저장, 문자 수를 반환하는 read(char[] cbuf) 메소드
배열에 cbuf[off] 부터 len개 문자 저장, len 값을 반환하는 read(char[] cbuf, int off, int len) 메소드

보조 스트림

보조 스트림

  • 다른 스트림과 연결되어 여러 가지 편리한 기능을 제공
  • 자체적으로 입출력이 불가능해 바이트/문자 기반 스트림 등에 연결해 사용
  • 문자 변환, 입출력 성능 향상, 기본 타입 입출력 등의 기능 제공
  • 프로그램은 입/출력 스트림을 직접 이용하지 않고 보조 스트림을 이용

 

연결될 스트림을 매개 값으로 넣어 보조 스트림 인스턴스 생성
보조 스트림을 매개 값으로 넣어 연속적으로 연결 가능
연속적으로 연결 예시

1. 문자 변환 보조 스트림

 

바이트 기반 출력 스트림을 문자 기반 출력 스트림 Writer로 변환하는 OutputStreamWriter
바이트 기반 입력 스트림을 문자 기반 입력 스트림 Reader로 변환하는 OutputStreamReader

2. 성능 향상 보조 스트림

  • 프로그램의 실행 성능은 입출력이 가장 늦은 장치 기준
  • 입출력 소스와 직접 작업하지 않고 중간에 메모리 버퍼 추가로 성능 향상
  • 출력 스트림에도 기본적으로 작은 버퍼가 있지만 성능이 낮음
  • 바이트 기반 보조 스트림: BufferedInputStream, BufferedOutputStream
  • 문자 기반 보조 스트림: BufferedReader, BufferedWriter

 

BufferedOutputStream & BufferedWriter: 버퍼로 고속 전송 후 한 번에 보내기 (출력)
BufferedInputStream & BufferedReader: 버퍼에 미리 데이터 저장 후 고속 읽기 (입력)
BufferedReader는 라인 단위로 파일 문자열을 읽는 readLine() 메소드 제공

3. 기본 타입 입출력 보조 스트림

 

DataInputStream & DataOutputStream: 바이트 입출력 스트림에 연결해 기본 타입 입출력 가능
기본 타입 입출력 보조 스트림 제공 메소드 (데이터 타입 별 크기가 다 달라 순서를 지켜 입출력)

4. 프린터 보조 스트림

 

PrintStream & PrintWriter: 바이트 & 문자 기반 출력 스트림과 연결해 프린터와 유사하게 출력
출력 데이터 타입에 따른 오버로딩 (println() 메소드는 개행 문자 \n를 추가해 줄바꿈 가능)

5. 객체 입출력 보조 스트림

 

ObjectOutputStream & ObjectInputStream: 바이트 기반 스트림과 연결해 객체를 입출력
직렬화 & 역직렬화

System.in / System.out 필드

콘솔 데이터 입출력 / 에러 출력에 System 클래스 사용
System.in 필드
Scanner 클래스

File 클래스

java.io 패키지의 File 클래스는 파일 및 폴더 정보를 제공 (운영체제마다 조금씩 다름)
파일 및 폴더 생성 관련 메소드
파일 및 폴더가 존재하는 경우 (exists() 메소드의 반환 값이 true) 관련 메소드
경로 정보 제공 목적으로 파일 객체 단독 생성