
import java.io.BufferedWriter;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
StringTokenizer st;
int caseNum = Integer.parseInt(br.readLine());
for (int i = 0; i < caseNum; i++) {
st = new StringTokenizer(br.readLine());
bw.write(Integer.parseInt(st.nextToken()) + Integer.parseInt(st.nextToken()) + "\n");
}
bw.close();
}
}
Java 빠른 입출력
BufferReader / BufferWriter
버퍼를 이용하여 읽기와 쓰기를 하는 함수이다.
그럼 그 동안 버퍼를 이용하지 않았나?
그렇다. 우리는 그동안 키보드의 입력이 키를 누르는 즉시 바로 프로그램에 전달했다.
버퍼를 이용하는 입력은 무엇이 다른가?
키보드의 입력이 있을 때마다 한 문자씩 버퍼로 전송한다. 그리고 버퍼가 가득 차거나 개행 문자가 나타났을 때 버퍼의 내용을 한 번에 프로그램에 전달한다.
왜 버퍼 방식이 더 빠를까?
하드디스크의 처리 속도는 느리기 때문에 키보드의 입력이 있을 때마다 바로 이동시키기 보다는 중간에 버퍼를 두어 한번에 묶어 보내는 방식이 더 효율적이고 빠른 방법이다. 쓰레기를 하나하나 분리수거장에 버리기 보다는 쓰레기통이라는 물건을 두어 가득 찰 때마다 비우는 방식이 더 효율적이라는 사실을 우리는 알고 있다.
Scanner
그럼에도 우리는 Scanner을 자주 이용한다 왜 일까?
Scanner는 지원해주는 메소드가 많고 사용하기 쉽다. 또한 띄어쓰기와 개행문자를 경계로 하여 입력 값을 인식하기에 따로 가공하는 노력이 필요 없어 간편하다. 하지만 버퍼 사이즈가 1024 char 이기에 많은 입력을 필요로 할 경우에는 성능 상 좋지 않은 결과를 일으킨다.
BufferReader
Scanner와 정확히 어떤 차이가 있는가?
BufferReader는 개행문자만 경계로 인식한다. 그리고 입력받은 데이터는 String으로 고정되기에 입력받은 데이터를 따로 가공하는 노력이 필요하다. 하지만 Scanner보다 속도가 빠르다는 장점도 존재한다.
버퍼 사이즈도 8192 char로 입력이 많은 경우 절대적으로 유리하다.