[JAVA] BuffredReader & BufferedWriter
BufferedReader라는 단어에서 볼 수 있듯이 'Buffer : 완충제' 역할을 하는 버퍼를 이용해서 읽는 함수 이다.
이 함수는 버퍼를 이용하기 때문에 이 함수를 이용하면 입출력의 효율이 좋아진다고 한다.
(버퍼에 용량만큼 모았다가 전달)
=> 대표적인 IO클래스 (Input/Output)
자바에서 데이터는 Stream을 통해 입출력됨
Stream은 단일 방향으로 연속적으로 흘러가는 것을 의미하고, 출발지에서 도착지로 흘러간다는 개념.
단방향 통신을 한다는 특징이 있기 때문에, 하나의 Stream으로 입출력을 동시에 할 수 없어서 같이 사용해야 함.
InputStream : 데이터 입력 받을 때 사용 (바이트기반 입력 스트림의 최상위 추상클래스)
OutputStream : 데이터를 출력할 때 사용 (바이트기반 출력 스트림의 최상위 추상클래스)
Java.io 패키지의 주요 클래스
* 바이트 단위 : 그림, 멀티미디어, 문자 등 모든 종류의 데이터들을 주고 받을 수 있다.
* 문자 단위 : Only 문자만 주고 받을 수 있다.
하드디스크 or 외부 장치(ex:키보드)와의 데이터 입출력은 생각보다 시간이 걸리는 작업이라고 한다.
그래서 키보드가 눌릴 때마다 눌린 문자의 정보를 목적지로 바로 이동 시키는 것보다는 버퍼역할을 하는 버퍼를 두어서 데이터를 이동시키는 것(입력, 출력) 이 보다 효율적이고 빠르다고 한다.
그리고 BufferedReader는 String만 읽을 수 있기 때문에, 다른 데이터 타입은 형변환을 해주어야 한다.
사용법
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
public class T2 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader (new InputStreamReader(System.in));
// 파일에서 입력을 받는 경우
FileReader fr = new FileReader("파일명");
BufferedReader br_f = new BufferedReader(fr);
BufferedWriter bw = new BufferedWriter (new OutputStreamWriter(System.out));
// 괄호안에 콘솔창으로 읽을건지, 파일로 읽을건지 등등에 따라 맞는 Reader & Writer를 넣는다.
String str = br.readLine();
//int i = Integer.parseInt(br.readLine()); => int로 형변환 할 경우
// String이기 때문에 형변환을 안해도 된다.
bw.write(str);
//bw.write(String.valueOf(i));=> int로 형변환 할 경우
// write만 하면 콘솔에 안나온다.
bw.flush();
// flush를 사용하면 한꺼번에 쏟아낸다. == 버퍼를 비우는 동작
bw.close();
br.close();
// Scanner 닫듯이 이것도 닫아주자.
★예외처리는 필수 ★ : throws IOExcetion 또는 try~catch 구문을 활용해야 한다.
주요메서드 - BufferedReader
메서드 | 설명 |
void close() | 입력 스트림을 닫고 사용하던 자원 해제 |
void mark(int, readAheadLimit) | 스트림의 현재 위치를 마킹 |
boolean markSupported() | 스트림이 mark 기능을 지원하는 boolean으로 알려줌 |
int read() | 한 글자만 읽어 아스키코드 값으로 반환 |
int read(char[] cbuf, int offset, int length) | cbuf의 offset위치부터 length의 길이만큼 문자를 스트림으로 읽어온다 |
String readLine() | 한 줄을 읽어 온다 |
boolean ready() | 입력 스트림이 사용할 준비가 되어있는지 알려준다 |
void reset() | 읽는 위치를 처음으로 변경. IF) 마킹이 되어있다면, 마킹된 위치로 변경 |
long skip(long n) | n개의 문자를 건너 뛴다. |
주요메서드 - BufferedWriter
메서드 | 설명 |
void close() | 스트림을 닫는다. |
void flush() | 스트림을 비운다. |
void newLine() | 개행 문자를 출력. |
void write(char[] cbuf, int offset, int length) | cbuf의 offset위치부터 length만큼 출력. |
void write(int c) | 한 글자를 출력 |
void write(String s, int offset, int length) | s문자열에서 offset부터 length만큼 출력. |
Scanner 클래스와의 차이점
Scanner 클래스 : Enter, Space 모두 경계로 입력값을 인식 (공백 단위로 끊음)
BufferedReader 클래스 : Enter만을 경계로 입력값을 인식
(데이터의 양이 적을 때는 차이가 미미하지만, 많은 양의 데이터를 처리하는 경우에는
버퍼에 모아서 한 번에 전달하는것이 빠르고 효율적이라고 한다.)