JAVA/자바 이론 / / 2021. 6. 12. 16:19

Java | 8 입출력 스트림

01 스트림 입출력

02 바이트 스트림 다루기

03 문자 스트림 다루기

04 버퍼 입출력(Buffered I/O)

 

# 임출력 스트림(Stream)

- 자바의 스트림은 입력/출력 장치와 프로그램 사이의 데이터 흐름, 또는 소프트웨어 장치를 뜻한다.

 

# 입출력 스트림(Stream)의 특징

º 스트림의 양끝에는 입출력 장치와 자바 응용프로그램이 연결

- 자바 응용프로그램은 입력 스트림과 출력 스트림과만 연결하고, 입출력 스트림이 입출력 장치를 제어하고 실질적인 입출력을 담당

º 스트림은 단방향임

- 입력 스트림은 입력 장치에서 응용 프로그램으로 데이터를 전송, 출력 스트림은 응용프로그램으로부터 받은 데이터를 출력 장치로 전송

- 두 가지 기능을 모두 가진 스트림은 없음

º 스트림을 통해 흘러가는 기본 단위는 바이트나 문자임

º 스트림은 선입선출(FIFO) 구조

- 입력 스트림에 먼저 들어온 데이터가 응용프로그램에 먼저 전달, 출력 스트림은 응용프로그램이 출력한 순서대로 출력 장치에 보냄.

 

# 스트림 연결 예제

- 표준 입력 스트림 System.in에 InputStreamReader 스트림을 연결하는 사례

표준 입력 스트림을 문자 스트림으로 변환

InputStreamReader rd = new InputStreamReader(System.in);

int c = rd.read();  // 키보드에서 문자 1개 씩 읽어서 정수로 리턴

 

# InputStreamReader의 메소드와 생성자

InputStream의 메소드 설명
void close() 입력 스트림을 닫고 관련된 시스템 자원 해제
String getEncoding() 스트림이 사용하는 문자 집합의 이름 리턴
int read() 한 개의 문자를 읽어 정수형으로 리턴 (없을 경우 -1 반환)
int read(char[] cbuf, int offset, int length) 최대 len 개수의 문자들을 읽어 cbuf 배열의 off 위치부터 저장하고 실제 읽은 개수 리턴
boolean ready() 입력 스트림이 문자를 읽어 들일 수 있는 상태인지 리턴
InputStream의 생성자 설명
InoutStreamReader(InputStream in) in으로부터 읽는 기본 문자 집합의 InputStreamReader 생성
InputStreamReader
(InputStream in, Charset cs)
in으로부터 읽는 cs 문자 집합의 InputStreamReader 생성
InputStreamReader
(InputStream in, String charsetName)
in으로부터 읽는 charsetName 문자집합 InputStreamReader 생성

 

# 자바 입출력 스트림의 종류

º 바이트 입출력 스트림(byte stream)

- 단순 바이트의 흐름으로만 처리

- ex) 바이너리 파일을 읽는 입력 스트림

º 문자 입출력 스트림(character stream)

- 문자의 흐름으로 처리

- 문자가 아닌 바이너리 데이터는 문자 스트림에서 처리하지 못함.

- ex) 텍스트 파일을 읽는 입력 스트림

 

# 바이트 스트림 클래스

º 바이트 스트림 : 바이트 단위의 바이너리 값을 읽고 쓰는 스트림

º 바이트 스트림 클래스 : java.io 패키지에 포함

- InputStream / OutputStream

→ 추상 클래스

→ 바이트 입출력 스트림을 다루는 모든 클래스의 슈퍼 클래스

(1) FileInputStream / FileOutputStream

- 파일로부터 바이트 단위로 읽거나 저장하는 클래스

- 바이너리 파일의 입출력

(2) DataInputStream / DataOutputStream

- 자바의 기본 데이터 타입의 값(변수)을 바이너리 값 그대로 입출력

 

# FileOutputStream 클래스의 메소드와 생성자

FileOutputStream의 메소드 설명
void write(int b) int 형으로 넘겨진 한 바이트를 출력 스트림으로 출력
void write(byte[] b) 배열 b의 바이트를 모두 출력 스트림으로 출력
void write(byte[] b, int off, int len) len 크기만큼 off부터 배열 b를 출력 스트림으로 출력
void flush() 출력 스트림에서 남아 있는 바이너리 데이터 모두 출력
void close() 출력 스트림을 닫고 관련된 시스템 자원 해제
FileOutputStream의 생성자 설명
FileOutputStream(File file) file이 지정하는 파일에 출력하는 FileOutputStream 생성
FileOutputStream(String name) name이 지정하는 파일에 출력하는 FileOutputStream 생성
FileOutputStream
(File file, Boolean append)
FileOutputStream을 생성하며 append가 true이면 file이 지정하는 파일의 마지막부터 데이터 저장
FileOutputStream
(String name, Boolean append)
FileOutputStream을 생성하며 append가 true이면 name이 름의 파일의 마지막부터 데이터 저장

 

# DataInputStream & DataOutputStream 메소드

- DataInputStream과 DataOutputStream 클래스는 기초 자료형 단위로 데이터를 읽고 쓸 수 있음

- 바이트 단위가 아니라 double 타입으로 읽고 쓸 수 있음

- 각 자료형의 크기가 다르기 때문에 쓸 때와 동일한 순서로 읽어야 함

 

# 문자 스트림

º 문자 스트림 : 유니 코드로 된 문자를 입출력하는 스트림

- 문자 데이터만 다룬다. 이미지, 동영상과 같은 바이너리 데이터는 (x)

º 문자 스트림을 다루는 클래스

- Reader / Writer

→ java.io 패키지에 포함

→ 추상 클래스. 문자 스트림을 다루는 모든 클래스의 슈퍼 클래스

(1) InputStreamReader / OutputStreamWriter

- 바이트 스트림과 문자 스트림을 연결시켜주는 다리 역할

- InputStreamReader : 바이트를 읽어 문자로 인코딩하여 입력

- OutputStreamWriter : 문자를 바이트로 디코딩하여 출력

(2) FileReader / FileWriter

- 텍스트 파일에서 문자 데이터 입출력

 

# FileReader의 메소드와 생성자

FileReader의 메소드 설명
int read() 한 개의 문자를 읽어 정수형으로 리턴
int read(char[] cbuf) 최대 cbuf 배열의 크기만큼 문자들을 읽어 cbuf 배열에 저장.
만일 읽는 도중 EOF를 만나면 실제 읽은 문자 개수 리턴
int read(char[] cbuf, int off, int len) 최대 len 크기만큼 읽어 cbuf 배열의 off부터 저장. 읽는 도중 EOF를 만나면 실제 읽은 문자 개수 리턴
String getEncoding() 스트림이 사용하는 문자 집합의 이름 리턴
void close() 입력 스트림을 닫고 관련된 시스템 자원 해제
FileReader의 생성자 설명
FileReader(File file) file에 지정된 파일로부터 읽는 FileReader 생성
FileReader(String name) name 이름의 파일로부터 읽는 FileReader 생성

 

# FileWriter의 메소드와 생성자

FileWriter의 메소드 설명
void write(int c) c를 char로 반환하여 한 개의 문자 출력
void write(String str) 문자열 str 출력
void write(String str, int off, int len) 인덱스 off부터 len개의 문자를 str 문자열에서 출력
void write(char[] cbuf, int off, int len) 인덱스 off부터 len개의 문자를 배열 cbuf에서 출력
void flush() 스트림에 남아 있는 텍스트 모두 출력
String getEncoding() 스트림이 사용하는 문자 집합의 이름 리턴
void close() 출력 스트림을 닫고 관련된 시스템 자원 해제
FileWriter의 생성자 설명
FileWriter(File file) file에 데이터를 저장할 FileWriter 생성
FileWriter(String name) name 파일에 데이터를 저장할 FileWriter 생성
FileWriter(File file, Boolean append) FileWriter를 생성하여, append가 true이면 파일의 마지막부터 데이터 저장
FileWriter(String name, Boolean append) FileWriter를 생성하며, append가 true이면 파일의 마지막부터 데이터 저장

 

# FileReader / FileWriter vs FileInputStream / FileOutputStream

º  FileReader / FileWriter 과 FileInputStream / FileOutputStream 모두 File에 데이터를 입력하고 출력하는 객체로 두 종류의 객체는 차이가 있음

- FileInputStream / FileOutputStream  : InputStream / OutputStream을 상속

- FileReader / FileWriter : Reader / Writer을 상속

 

- FileInputStream / FileOutputStream : byte 단위의 입출력을 처리

- FileReader / FileWriter : 바이트를 문자(Char)로 변환하여 입출력을 처리

 

- FileInputStream / FileOutputStream : 1바이트 이상의 문자인 한글 등을 처리하기 위해 버퍼를 사용해서 처리

- FileReader / FileWriter : 한글도 처리 가능

 

# 요약

  • 입출력 스트림은 입출력 장치와 프로그램 사이의 일련의 데이터 흐름
  • 문자 스트림은 유니코드로 된 문자 단위의 데이터가 흐르는 스트림, 문자가 아닌 정보는 문자 스트림의 데이터가 될 수 없음
  • 문자 스트림을 다루는 자바의 모든 클래스는 추상 클래스인 Reader와 Writer 클래스의 서브 클래스임
  • 문자 스트림은 문자 정보를 가진 텍스트 파일만 처리할 수 있고 바이너리 파일의 입출력에는 사용할 수 없음
  • 문자 입력 스트림을 다루는 자바 클래스에는 Reader, InputStreamReader, FileReader 등이 있음
  • 문자 출력 스트림을 다루는 자바 클래스에는 Writer, OutputStreamWriter, FileWriter 등이 있음
  • 바이트 스트림은 8비트 바이트 단위의 데이터가 흐르는 스트림
  • 바이트 스트림을 다루는 자바의 모든 클래스는 추상 클래스인 InputStream과 OutputStream의 서브 클래스임
  • 바이트 스트림은 텍스트 파일의 입출력에도 사용 가능하지만 이미지나 동영상과 같은 바이너리 데이터를 입출력하는 데 보다 적합
  • 바이트입력 스트림을 다루는 자바 클래스에는 InputStream, FileInputStream, DataInputStream 등이 있음
  • 바이트 출력 스트림을 다루는 자바 클래스에는 OutputStream, FileOutputStream, DataOutputStream 등이 있음
  • 버퍼 입출력(Buffered I/O)은 입출력 스트림과 프로그램 사이에 버퍼를 두어 입출력 장치의 속도와 프로그램의 처리 속도의 완충 작용을 수행하므로 효율적으로 입출력을 처리
  • 바이트 버퍼 스트림을 다루는 자바 클래스는 BufferedInputStream과 BufferedOutputStream이 있음
  • 문자 버퍼 스트림을 다루는 자바 클래스는 BufferedReader와 BufferedWriter가 있음
  • File 클래스는 파일과 디렉터리 경로명의 추상적 표현임
  • File 클래스는 파일 삭제, 파일 이름 변경, 디렉터리 생성 등과 같은 파일 관리 작업을 수행
  •  클래스는 파일 입출력을 위한 기능은 제공하지 않음.

 

 

 

'JAVA > 자바 이론' 카테고리의 다른 글

Java | Lab7-2 제네릭과 컬렉션  (0) 2021.06.12
Java | 7-1 제네릭과 컬렉션  (0) 2021.06.10
Java | 6 패키지  (0) 2021.06.06
Java | 5-2 상속과 다형성  (0) 2021.05.25
Java | 5-1 상속과 다형성  (0) 2021.05.25
  • 네이버 블로그 공유
  • 네이버 밴드 공유
  • 페이스북 공유
  • 카카오스토리 공유