BufferedReader와 BufferedWriter는 버퍼를 사용하여 읽기와 쓰기를 하는 함수이다.
버퍼를 사용하지 않는 입력은, 키보드의 입력이 키를 누르는 즉시 바로 프로그램에 전달된다.
하지만 버퍼를 사용하는 입력은, 키보드의 입력이 있을 때마다 한 문자씩 버퍼로 전송한다. 버퍼가 가득 차거나 혹은 개행 문자(줄 바꿈 문자)가 나타나면 버퍼의 내용을 한 번에 프로그램에 전달한다.
한번 버퍼를 거쳐 출력되는 것 보다, 키보드의 입력을 받는 즉시 출력하는 것이 빠를 것이라고 생각할 수 있다.
하드디스크는 속도가 느리고 외부 장치(키보드, 모니터 등)와 데이터 입출력도 생각보다 시간이 오래 걸린다. 그렇기 때문에 키보드의 입력이 있을 때마다 바로 이동시키는 것보다, 중간에 버퍼를 두고 한번에 묶어 보내는 것이 더 효율적이고 빠른 방법이다.
예를 들어, 쓰레기통을 비울 때 하나하나 버리는 것보다 집의 쓰레기통이 꽉 차면 한 번에 버리는 게 더 효율적인 것과 비슷하다고 생각하면 된다.
Scanner
Scanner는 띄어쓰기와 개행문자를 경계로 하여 입력값을 인식한다 . 그렇기 때문에 따로 가공할 필요가 없어 편리하다.
가공할 필요가 없다는 뜻은, 만약 int형 변수를 입력받고자 하면 Scanner의 nextInt() 메서드를 사용하여 바로 원하는 타입의 입력을 받을 수 있다.
하지만 BufferedReader는 입력 받은입력받은 데이터가 String으로 고정되기 때문에 입력받은 데이터를 원하는 타입으로 가공하는 작업이 필요하다.
Scanner는 지원해주는 메서드가 많고, 사용하기 쉽기 때문에 많이 사용하지만, 버퍼 사이즈가 1024 char이기 때문에 많은 입력을 필요로 할 경우에는 성능상 좋지 못하다.
BufferedReader
Scanner와 달리 BufferedReader는 개행문자만 경계로 인식하고 입력받은 데이터가 String으로 고정된다. 그렇기 때문에 따로 데이터를 가공해야 하는 경우가 많다. 하지만 Scanner보다 속도가 빠르다.
버퍼 사이즈도 Scanner가 1024 char인데 비해, BufferedReader는 8192 char(16,384byte)이기 때문에 입력이 많을 때 BufferedReader가 유리하다.
데이터 가공
BufferedReader를 통해 읽어온 데이터는 개행문자 단위 (Line 단위)로 나눠진다. 만약 이를 공백 단위로 데이터를 가공하고자 한다면 따로 작업을 해야 한다. 이때 사용하는 것이 StringTokenizer나 String.split() 함수이다.
아래 링크에서 차이점을 확인할 수 있다.
StringTokenizer와 String.split()의 차이
[Java] StringTokenizer 문자열 분리 (split과 차이)
1. StringTokenizer 클래스란?StringTokenizer 클래스는 문자열을 구분자를 이용하여 분리할 때 사용할 수 있다. 만약 BufferedReader 클래스의 메서드로 입력을 읽어들인다면 라인 단위로 읽어들일 수 밖에
smarthammer.tistory.com
StringTokenizer의 nextToken() 함수를 사용하면 readLine()을 통해 입력 받은 값을 공백 단위로 구분하여 순서대로 호출할 수 있다.
String.split() 함수를 사용하면, 문자열 배열에 공백단위로 끊어 데이터를 저장할 수 있다.
BufferedReader 클래스의 메인 함수들
BufferedWriter
많은 양의 출력을 할 때는, 입력과 동일하게 버퍼를 사용하는 것이 좋다.
BufferedWriter 사용법
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
String s = "abcdef"; // 출력할 문자열
bw.write(s); // 출력
bw.newLine(); // 줄바꿈
bw.flush(); // 남아있는 데이터 모두 출력
bw.close();
BufferedWriter는 System.out.println(""); 처럼 출력과 개행을 동시에 해주지 않기 때문에, 개행을 위해선 따로 newLine(); 또는 bw.write("\n"); 을 사용해야 한다.
그리고 BufferedWriter의 경우 버퍼를 잡아 놓았기 때문에 반드시 사용 후 flush() 또는 close()를 해주어야 한다.
BufferedWriter 클래스의 메인 함수들
'Java' 카테고리의 다른 글
Java에서 JJWT (Java Json Web Token)를 이용한 JWT(Json Web Token) 사용 방법 (0) | 2024.07.03 |
---|---|
JWS / JWT (0) | 2024.07.02 |
H2 데이터 베이스 (1) | 2024.06.14 |
[Java] StringTokenizer 문자열 분리 (split과 차이) (0) | 2024.06.14 |
[Java] System.arraycopy 사용법 (0) | 2024.03.22 |