[Java] BufferedReader / BufferedWriter 사용 방법과 사용하는 이유
BufferedReader
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String s = br.readLine();
String[] arr = s.split(" ");
StringTokenizer st = new StringTokenizer(br.readLine());
int n = Integer.parseInt(st.nextToken());
}
}
일반적으로 readLine()을 이용해 개행을 제외한 라인 단위로 입력을 받는다.
공백을 기준으로 나누기 위해서는 split()이나 StringTokenizer를 이용해 나누어준다.
readLine()은 문자열 형태로만 받을 수 있기 때문에 원하는 타입으로 직접 형변환을 해주어야 한다.
BufferedWriter
public class Main {
public static void main(String[] args) throws IOException {
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
bw.write(s);
bw.flush();
bw.close();
}
}
write()를 통해 출력해준다.
write()를 출력이라 표현했지만 콘솔이 아니라 버퍼에 입력된 것이기 때문에 화면에 나타나지 않는다.
버퍼는 가득차지 않으면 출력되지 않기 때문에 flush()를 통해 버퍼에 들어있는 값을 출력해 주어야한다.
close()를 통해 마지막에 스트림을 닫아준다.
(close()는 기본적으로 flush()를 한 번 실행하고 스트림을 닫는다.)
BufferedReader / BufferedWriter를 사용하는 이유
우리가 인터넷으로 쇼핑할 때 상품마다 따로 결제하지 않는다.
상품을 장바구니에 담아두었다가 일괄적으로 결제한다.
여기서 버퍼는 장바구니의 역할을 한다.
입력이나 출력할 것들을 버퍼에 담아두었다가 한번에 이행함으로써 효율적인 입출력을 가능하게 한다.
BufferedReader와 Scanner
BufferedReader의 버퍼 사이즈는 약 8kb, Scanner는 약 1kb로 대량으로 데이터를 입력할 때에 둘의 속도는 크게 차이가 난다.
하지만 둘의 속도 차이는 데이터의 크기가 작을 때에도 나타나는데 그 이유는 파싱에 있다.
Scanner는 입력을 받을 데이터의 타입을 원하는 대로 받을 수 있도록 해준다.
숫자 천 단위 마다 콤마(1,000)를 찍어도 정수로 받을 수 있을만큼 사용자에게 편리한 도구가 된다.
하지만 이러한 기능들이 필요가 없을 때에도 작동하면서 비효율적이게 되고 속도가 느려지는 결과를 낳는다.
BufferedReader를 사용하면 사용자가 직접 취해야할 동작들이 많지만 그만큼 비효율적인 동작을 줄일 수 있다.