BufferedReader는 Scanner와 다르게 8192 char (16384 byte) 크기의 버퍼에 담아두었다가 한번에 전송하기 때문에 효율적이고 빠른 전송이 가능하다.
Scanner
https://docs.oracle.com/javase/8/docs/api/java/util/Scanner.html
"A simple text scanner which can parse primitive types and strings using regular expressions
A Scanner breaks its input into tokens using a delimiter pattern, which by default matches whitespace. The resulting tokens may then be converted into values of different types using the various next methods."
즉 Scanner는 동작하는 과정이 정규 표현식 사용 , 딜리미터 패턴을 통한 입력값 분할(Tokenizing) 및 자료형 변경 등등의 과정이 걸쳐지기 때문에 낮은 성능을 보이게 된다.
BufferedReader
https://docs.oracle.com/javase/8/docs/api/java/io/BufferedReader.html
Reads text from a character-input stream, buffering characters so as to provide for the efficient reading of characters, arrays, and lines.
The buffer size may be specified, or the default size may be used. The default is large enough for most purposes.
빨간색으로 강조한 부분을 보면 알겠지만 이미벌써 효율적이라고 나와있다.
버퍼 리더는 버퍼에 입력값을 저장한후 line단위로 값을 전달하기 때문에 높은 성능을 낼 수 있다.
용어
- 버퍼 : 데이터를 전송하기전 임시적으로 보관하는 임시 메모리 영역.
- 버퍼 플러시(buffer flush) : 버퍼의 데이터를 출력시킴으로써 비우는 행동
- bufferedReader : 버퍼를 통한 입력
- bufferedWriter : 버퍼를 통한 출력
주의할 점 : 입출력 클래스는 반드시 예외처리를 해야한다. 다만 Scanner나 System.out.print는 해당 메소드 안에서 자체적으로 예외처리를 하기 때문에 예외처리를 해줄 필요 없지만 bufferedReader같은 경우 try-catch 문이나 throws IOException으로 처리해 줘야 한다.
BufferedReader 사용법
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String s = br.readLine();
int i = Integer.parseInt(br.readLine());
}
readLine() 메소드는 리턴값이 String이므로 다른 타입을 받으려면 반드시 형변환을 해야하며. 또한 예외처리를 해야한다.
Scanner는 공백을 기준으로 데이터를 끊어 읽어오지만 BufferedReader는 한번에 데이터가 들어오므로 이를 끊어주며 데이터를 받기위해서는 StringTokenizer 혹은 String 클래스의 split 메소드를 이용할 수 있다.
StringTokenizer 사용법
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(br.readLine()); // n = 5
StringTokenizer st = new StringTokenizer(br.readLine()); // st = 4,2,6,1,3
StringBuilder sb = new StringBuilder();
for(int i = 0; i<n; i++){
sb.append(Integer.parseInt(st.nextToken()));
}
System.out.println(sb); 4,2,6,1,3
}
StringTokenizer를 통해 BufferedReader를 통해 들어온 데이터를 가공처리를 하게 된다.
nextToken()메소드를 통해 st 내부의 데이터를 하나씩 끊어서 가져온다.
BufferedWriter 사용법
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
int n = Integer.parseInt(br.readLine());
StringTokenizer st = new StringTokenizer(br.readLine());
StringBuilder sb = new StringBuilder();
for(int i = 0; i<n; i++){
sb.append(Integer.parseInt(st.nextToken()));
}
bw.write(String.valueOf(sb));
bw.flush();
bw.close();
}
BufferedWriter는 write(), flush(), close()가 사용된다.
write()를 통해 출력할 내용을 담고, flush()를 통해 버퍼를 비움과 동시에 콘솔에 출력을 한다. 출력을 마쳤으면 close()를 통해 스트림을 끝낸다.
'자바' 카테고리의 다른 글
[자바] 기본형 매개변수와 참조형 매개변수 (객체지향) (0) | 2023.01.19 |
---|---|
[자바] 힙(heap)과 스택(stack) 메모리 구조 (0) | 2023.01.18 |
[자바] Comparable, Comparator (0) | 2023.01.13 |
[자바] CompareTo (0) | 2023.01.13 |
[자바] 람다식 개념 및 표현법 (0) | 2023.01.12 |