[자바 기초 문법] 입출력 처리
입출력 스트림
스트림이란?
- 순서가 있는 데이터의 연속적 흐름이다.
- 데이터 소스와 상관없이 적용할 수 있어 효과적이다.
- 예시) 키보드 및 모니터 입출력, 프로그램과 외부 장치, 파일의 입출력에서 데이터 흐름도 스트림, 네트워크와 통신하는 데이터의 흐름
특징
- 선입선출 구조라서 순차적으로 흘러가고 순차적으로 접근한다.
- 임의 접근 파일 스트림을 제외한 모든 스트림은 단방향이다.
- 입출력 스트림은 객체이다.
- 출력 스트림과 입력 스트림을 연결해 파이프라인 구성이 가능하다.
- 지연이 가능하다. (프로그램에 연결한 출력 스트림에 데이터가 가득 차면 프로그램을 더 이상 출력할 수가 없어 빈 공간이 생길때까지 지연된다! 입력 스트림도 마찬가지)
바이트 스트림과 문자 스트림
입출력 스트림의 사용
바이트 스트림
바이트 단위의 이진 데이터를 다루므로 이미지나 동영상 파일을 처리할 때 유용하다.
InputStream과 OutputStream은 각각 read()와 write()라는 추상 메서드를 포함한다. 모든 자식 바이트 스트림에서 공통으로 사용하는 메서드를 포함한 바이트 스트림의 최상위 클래스이다.
- 바이트 스트림 클래스가 제공하는 주요 메서드
클래스 | 메서드 | 설명 |
InputStream | int available() | 읽을 수 있는 바이트 개수 반환 |
void close() | 입력 스트림 닫음 | |
abstract int read() | 1바이트 읽음 | |
int read(byte b[ ]) | 1바이트씩 읽어 b[]에 저장한 후 읽은 개수 반환 | |
int read(byte b[ ], int off, int len) | len만큼 읽어 b[]의 off 위치에 저장한 후 읽은 개수 반환 | |
OutputStream | void close() | 출력 스트림 닫는다 |
void flush() | 출력하려고 버퍼의 내용 비운다 | |
abstract void write(int b) | b 값 바이트로 변환해서 쓴다 | |
void write(byte b[ ]) | b[ ]값을 바이트로 변환해서 쓴다 | |
void write(byte b[], int off, int len) | b[ ]값을 바이트로 변환해서 off 위치부터 len만큼 쓴다. |
- FileInputStream과 FileOutputStream
시스템에 있는 모든 파일을 읽거나 쓸 수 있는 기능을 제공한다.
생성자로 스트림 객체를 생성할 때는 FileNotFoundException 예외 가능성이 있기 때문에 예외 처리가 필요하다.
FileInputStream(String name) //파일 시스템의 경로를 나타내는 문자열이다.
FileInputStream(File file)
FileOutputStream(String name)
FileInputStream(File file)
FileInputStream(String name, boolean append)
- BufferedInputStream과 BufferedOutputStream
버퍼는 스트림과 프로그램 간에 데이터를 효율적으로 전송하려고 사용하는 메머리다. 입출력 장치와 프로그램 간 동작 속도가 크게 차이가 날 때 버퍼를 사용하면 효율적이다.
<생성자>
BufferedInputStream(InputStream in)
BufferedInputStream(InputStream in, int size)
BufferedOutputStream(OutputStream out)
BufferedOutputStream(OutputStream out, int size) //버퍼의 크기를 나타낸다.
- DataInputStream과 DataOutputStream
- 각각 기초 타입 데이터를 읽는 메서드와 기초 타입 데이터를 기록하는 메서드를 사용할 수 있는 스트림이다.
- 직접 키보드에서 데이터를 입력 받거나 콘솔 뷰에 데이터를 출력하기에는 부적합하다.
- FileInputStream 및 FileOutputStream 등 다른 스트림과 연결해서 파이프라인을 구성해서 사용한다.
- PrintStream
- 다양한 데이터 값을 편리하게 표현할 수 있도록 출력 스트림에 기능을 추가한 스트림이다. IO Exception을 발생하지 않는다.
- 자동 플러시 기능을 제공해 flush() 메서드를 호출하지 않고도 버퍼를 비울 수 있다.
PrintStream(File file)
PrintStream(String filename)
PrintStream(OutputStream out)
PrintStream(OutputStream out, boolean autoFlush) //자동 플러시 기능을 선택할 수도 있다.
System.out 객체의 println(),print(), printf() 메서드는 PrintStream으로 출력한다.
문자 스트림
한글처럼 언어로 된 파일을 처리할 때 유용하다.
- Rreader과 Writer는 추상메서드인 read(), close()와 write(), flush(), close()를 각각 포함하는 추상 클래스이다.
- Reader과 Writer는 객체를 생성할 수 없는 추상 클래스이다. Reader과 Writer의 자식인 구현 클래스를 사용한다.
- FileReader과 FileWriter는 파일 입출력 클래스로, 파일에서 문자 데이터를 읽거나 파일에 문자 데이터를 저장할 때 사용한다.
- BufferedReader과 BufferedWriter는 데이터를 효율적으로 전송하려고 버퍼로 처리할 때 사용한다.
- 문자 스트림 클래스가 제공하는 주요 메서드
클래스 | 메서드 | 설명 |
Reader | abstract void close() | 입력 스트림을 닫는다 |
int read() | 1개의 문자를 읽는다 | |
int read(char[] cbuf) | 문자 단위로 읽어 cbuf[]에 저장한 후 읽은 개수를 반환 | |
abstract int read(char cbuf[ ], int off, int len) | len만큼 읽어 cbuf[ ]의 위치에 저장한 후 읽은 개수를 반환 | |
long skip (long n) | 입력 스트림을 n 문자만큼 건너뛴다. | |
Writer | abstract void close() | 스트림을 닫고 관련된 모든 자원을 반납 |
abstract void flush() | 버퍼의 내용을 비운다 | |
void write(int c) | c 값을 char로 변환해 출력 스트림에 쓴다 | |
void write(char cbuf[ ]) | cbuf[ ] 값을 char로 변환해 출력 스트림에 쓴다 | |
abstract void write(char cbuf[], int off, int len) | cbuf[ ]값을 char로 변환해 off 위치부터 len만큼 출력 스트림에 쓴다 | |
void write(String str) | 문자열 str을 출력 스트림에 쓴다. |
- FileReader와 FileWriter
시스템에 있는 모든 문자 파일을 읽거나 쓸 수 있는 기능을 제공한다.
생성자로 스트림 객체를 생성할 때는 FileNotFoundException 예외 처리가 필요하다.
<생성자>
FileReader(String Name)
FileReader(File file)
FileWriter(String Name)
FileWriter(File file)
FileWriter(String Name, boolean append) //true면 이어쓰고(append) False면 덮어쓴다(overwrite)
FileWriter(File file, boolean append)
- BufferedReader와 BufferedWriter
스트림의 효율을 높이려고 버퍼를 사용한다.
<생성자>
BufferedInputStream(InputStream in)
BufferedInputStream(InputStream in, int size)
BufferedOutputStream(OutputStream out)
BufferedOutputStream(OutputStream out, int size) //int size는 버퍼의 크기를 나타낸다.
BufferedReader 클래스에 추가된 주요 메서드
메서드 | 설명 |
Stream<String> lines() | 읽은 행을 스트림으로 반환한다 |
String readLine( ) | 한 행을 읽어 문자열로 반환한다. |
- InputStreamReader와 InputStreamWriter
바이트 기반의 Input Stream과 OutputStream을 포장해 문자 기반의 Reader과 Writer로 변환하는 클래스이다.
<생성자>
InputStreamReader(InputStream in)
InputStreamReader(InputStream in, Charset cs)
OutputStreamWriter(OutputStream out)
OutputStreamWriter(OutputStream out, Charset cs)
- PrintWriter
PrintStream처럼 다양한 데이터 값을 편리하게 표현할 수 있도록 출력 스트림에 기능을 추가한 Writer의 자식 클래스이다.
참조: 어서와 Java는 처음이지?
쉽게 배우는 자바 프로그래밍 2판, 한빛아카데미, 우종정, 2020.