자바는 Scanner와 System.out.println()을 사용해서 콘솔 입출력을 처리할수 있지만 속도가 너무 느리다.그렇기에 빠른 입출력을 원한 경우 버퍼를 사용하는 BufferReader와 BufferWrite를 사용해야 한다.
버퍼란?일시적으로 데이터를 저장하는 임시 메모리 영역을 말한다. 버퍼는 데이터를 읽거나 쓸 때 발생하는 지연을 줄이기 위해 사용된다.BufferWriter를 사용해서 문자열을 버퍼에 저장해놨다가 버퍼가 꽉 차거나 코드를 사용해서 한번에 콘솔에 출력하게 할수 있다.버퍼의 기본값은8,192 바이트이며 생성자에서 인자를 전달하여 크기를 조정할수도 있다.
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
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));
int input = Integer.parseInt(br.readLine());
for(int i = 0; i < input; i++){
String[] nums = br.readLine().split(" ");
int number1 = Integer.parseInt(nums[0]);
int number2 = Integer.parseInt(nums[1]);
bw.write(String.valueOf(number1 + number2));
bw.newLine();
}
bw.flush();
bw.close();
br.close();
}
}
백준 15552번 문제 코드이다.시간 제한이 걸려있기에 Scanner와 println()을 사용하면 안 된다.
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
우선 import를 해준다.
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
그리고 new 연산자로 BufferReader,BufferWriter객체를 만들어준다.매개변수로 InputStreamReader,OutputStreamWriter 객체를 전달해주며 저들에게는 System.in,out을 매개변수로 전달해준다.자바는 참 쓸데없이 복잡한 틀딱언어다.
BufferedReader는 자바의 입력 스트림 처리 클래스 중 하나이다. 버퍼링을 사용하여 문자 단위로 데이터를 읽어들인다.
BufferedReader는 Reader 클래스를 상속받아 구현되어 있다. Reader 클래스는 문자 단위로 데이터를 읽어들이는 추상 클래스이다.BufferedReader는 Reader 클래스를 상속받아, Reader 클래스의 추상 메서드를 구현한 후에 추가적인 메서드를 제공한다.
BufferReader의 주요 메서드
read(): 스트림으로부터 한 문자를 읽어들이고,읽어들인 문자의 유니코드 값을 반환한다. 만약 더 이상 읽어들일 문자가 없다면 -1을 반환.
readLine(): 스트림으로부터 한 라인의 문자열을 읽어들입니다. 라인은 개행 문자(\n)로 끝납니다. 읽어들인 문자열을 반환한다. 만약 더 이상 읽어들일 문자열이 없다면 null을 반환합니다.
skip(long n): 스트림으로부터 n개의 문자를 건너뛰고, 그 이후부터 읽어들입니다.
reset(): 스트림의 위치를 마지막으로 호출한 mark() 메서드로 지정한 위치로 재설정합니다.
버퍼리더는 사용한 후에 close()를 사용해서 스트림을 닫아주는게 좋다.스트림을 닫아주면 내부적으로 사용한 버퍼(임시 메모리)도 자동으로 닫힌다.
int input = Integer.parseInt(br.readLine());
버퍼리더의 readLine()메서드를 사용해서 입력 스트림을 문자열 단위로 입력받는다.입력 받은뒤 문자열을 int로 변환해서 input에 넣어준다.
for(int i = 0; i < input; i++){
String[] nums = br.readLine().split(" ");
int number1 = Integer.parseInt(nums[0]);
int number2 = Integer.parseInt(nums[1]);
bw.write(String.valueOf(number1 + number2));
bw.newLine();
}
그 뒤 공백을 기준으로 입력받은 두개의 숫자를 버퍼리더가 줄 기준으로 입력받고,split(" ")을 통해서 공백 기준으로 자르고 배열에 넣는다.
그리고 string으로 저장되어 있는 배열 요소들을 int로 변환해서 각각number 변수에 넣어준다.그 다음 드디어 버퍼라이터가 나온다.
BufferedWriter는 자바의 출력 스트림 처리 클래스 중 하나로, 버퍼링을 사용하여 문자 단위로 데이터를 쓸 수 있다. 버퍼링을 사용함으로써 입출력 효율을 향상시킬 수 있다.
BufferedWriter는 Writer 클래스를 상속받아 구현되어 있다. Writer 클래스는 문자 단위로 데이터를 쓰는 추상 클래스이다. BufferedWriter는 Writer 클래스를 상속받아, Writer 클래스의 추상 메서드를 구현한 후에 추가적인 메서드를 제공한다.
BufferReader의 주요 메서드
write(int c): int값을 넣을시 한 문자를 출력하고 그 문자의 유니코드 값을 반환한다..(출력한다 = 버퍼에 넣는다, 반환한다 = 콘솔에 출력한다)
write(String str): 문자열을 출력한다.
write(char[] cbuf): 문자 배열을 출력한다
write(char[] cbuf, int off, int len): 문자 배열의 일부분을 출력한다
newLine(): 개행 문자(\n)를 출력합니다.
flush(): 버퍼에 저장된 내용을 스트림으로 출력한다(여기서 콘솔 출력이 이루어진다.)
close(): 스트림을 닫는다.
bw.write(String.valueOf(number1 + number2));
bw.newLine();
bw.write()메서드에 String.valuOf로 형변환한 int 값을 전달해서 버퍼에 입력해준다.그리고 줄을 바꿔준다.
bw.flush();
bw.close();
br.close();
여기서 좀 헷갈렸는데,최종적인 콘솔 출력은 bw.flush()에서 이루어진다.bw.write()는 버퍼에 출력하는거지 콘솔에 출력하는게 아니다.콘솔에 출력한뒤 bw와 br을 닫아주면서 코드가 끝난다.