[Java] BufferedReader /BufferedWriter 빠른 입출력

2020-10-01


알고리즘 문제를 풀다 보면 항상 문제에 대한 입력값이 주어지는데 

(Ex) N * M  = K) 이러한 입력값을 받기 위해서

Scanner라는 함수를 많이 사용할 것이다.

 

물론 필자도 Scanner이 사용이 편하고 해당 함수로

입력 함수를 입문을 했기 때문에 조금 더 익숙한 것이 사실이다.

(BufferedReader는 선언시 조금 길다..)


	Scanner scan = new Scanner(System.in);
    //Scanner 사용전 변수 선언
	BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
    //BufferedReader 사용전 변수 선언

(실제로 변수를 선언하는 과정에서는 길이가 두배 정도 차이 난다.)

 

다만 성능면에서는 BufferedReader함수보다 구리다는 것은

누구나 아는 사실이다.
(성능 == 속도)

 

때문에 입력받는 값이 많을 경우에는 해당 값을 버퍼에 저장해

코드를 처리할 수 있는 BufferReader함수를 사용하는 것이 좋다.

사용법은 아래와 같다.

 


버퍼 개념

 

버퍼(buffer, 문화어: 완충기억기)는 데이터를

한 곳에서 다른 한 곳으로 전송하는 동안

일시적으로 그 데이터를 보관하는 메모리의 영역이다. 

버퍼링(buffering)이란 버퍼를 활용하는 방식 또는 버퍼를 채우는 동작을 말한다.

다른 말로 '큐(Queue)'라고도 표현한다.

 

출처 : 위키피디아

 


소스코드

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
//패키지를 무려 3개나 사용

public class main629 {

	public static void main(String[] args) throws NumberFormatException, IOException {
											//예외처리는 필수
		BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
		
		int n = Integer.parseInt(bf.readLine());
		
		System.out.println(n);	

	}

}

 

또한 BufferedReader 함수는 기본 입력값이 항상 String이기 때문에

int / double / long와 같은 다른 속성으로 변경을 하기 위해서는

형 변환 작업이 필요하다.

 

(예외처리를 하지 않으면 오류가 나기 때문에 항상 체크해 주어야 한다!)


출력 시에는 주로 단축키 sout를 사용한

System.out.println(); 를 주로 사용할 것이다.

 

다만 이것도 버퍼를 거치지 않는 출력으로

속도면에서 BufferedWriter보다 느리다는 것이

저명한 사실이다. 

 

때문에 많은 출력을 요할 때에는

BufferedWriter를 사용해 좀 더 효율적인

작업을 진행할 수 있다.

소스코드는 아래와 같다.


소스코드

import java.io.BufferedWriter;
import java.io.IOException;
import java.io.OutputStreamWriter;
//패키지를 무려 3개나 사용

public class main629 {

	public static void main(String[] args) throws NumberFormatException, IOException {
											//예외처리는 필수
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
		
		String text = "안녕하세요!";
		
		bw.write(text);
		//System.out.print();
		//입력받은 문자를 출력하는 기능
		bw.newLine();
		//System.out.println(); 
		//에서 ln과 같은 기능 줄을 바꾸어준다.
		
		bw.flush();
		//혹시나 남아있는 데이터들은 모두 출력함
		bw.close();
		//출력문을 닫는 함수
	}

}