BufferedReader
와 BufferedWriter
는 버퍼를 사용해 읽기와 쓰기를 하는 함수이다.
하드디스크는 속도가 느리다. 외부장치와 데이터 입출력도 생각보다 시간이 오래 걸리기 때문에 키보드의 입력이 있을때 마다 바로 이동시키는 것보다 중간에 버퍼를 두어 한번에 보내는 것이 더 효율적이고 빠른 방법이다.
버퍼
데이터를 한 곳에서 다른 한 곳으로 전송하는 동안 일시적으로 해당 데이터를 보관하는 임시 메모리 영역을 말한다. 주로 입출력 속도 향상을 위해 버퍼를 사용한다.
Scanner
와 달리 BufferedReader
는 개행문자만 경계로 인식하고 입력받은 데이터가 String
으로 고정된다. 그렇기 때문에 따로 데이터를 가공해야 하는 경우도 많지만 Scanner
보다 속도가 빠르다는 장점이 있다.
BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); // 선언
String str = br.readLine();
int i = Integer.parseInt(br.readLine());
이와 같은 형식으로 사용하면 된다.
System.in
은 사용자로부터 입력을 받기 위한 입력 스트림이다. Scanner
클래스 뿐만 아니라 다른 입력 클래스들도 System.in
을 통해 사용자 입력을 받아야 한다.
입력은 readLine()
을 사용한다. String
으로 타입이 고정되어 있기에 다른 타입으로 입력받고자 한다면 형변환이 반드시 필요하다. 그리고 예외처리도 필수이다.
BufferedReader
를 통해 읽어온 데이터는 개행문자 단위로 나뉘어진다. 이를 공백 단위로 데이터를 가공하고자 한다면 따로 작업이 필요하다. 이때 사용하는 것이 StringTokenizer
나 String.split()
이다.
// StringTokenizer
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int n = Integer.parseInt(st.nextToken());
int m = Integer.parseInt(st.nextToken());
// String.split() 함수
String arr[] = s.split(" ");
nextToken()
을 사용하면 readLine()
을 통해 입력 받은 값을 공백단위로 구분해 순서대로 호출 가능하다.
String.split()
을 사용하면 배열에 공백단위로 끊어 데이터를 저장해 사용할 수 있다.
BufferedReader 클래스의 메인 함수
일반적으로 출력시에는 System.out.println()
을 사용한다. 적은 양의 출력에선 편리하지만 많은 양을 출력할 때는 입력과 동일하게 버퍼를 사용하는 것이 좋다.
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out)); // 선언
String str = "abcdef"; // 출력할 문자열
bw.write(s); // 출력
bw.newLine(); // 줄바꿈
bw.flush(); // 남아있는 데이터 모두 출력
bw.close();
BufferedWriter
는 System.out.println()
처럼 출력과 개행을 동시에 해주지 않기 때문에, 개행을 위해선 따로 newLine()
혹은 bw.write(\n)
을 사용해야 한다.
그리고 BufferedWriter
의 경우 버퍼를 잡아놓았기 때문에 사용 후에는 flush()
, close()
를 해주어야한다. close()
를 하게되면, 출력 스트림을 아예 닫기 때문에 한번 출력후, 다른 것도 출력하고자 한다면 flush()
를 사용하면 된다.
BufferedWriter 클래스 메인 함수
Scanner
는 사용자가 입력한 텍스트를 토큰 단위로 잘라 특정 형태로 반환하는 것이고 BufferedReader
는 사용자가 입력한 데이터 자체를 읽어들인다.