자바 [JAVA]

자바 [JAVA] - BufferedReader와 Scanner

Hong_1 2023. 1. 19.

이 글에서는 BufferedReaderScanner의 차이에 대해 알아 볼 것이다.

 

BufferedReaderScanner는 모두 자바에서 문자열 입력을 목적으로 사용된다.

아마 자바를 처음 배우는 사람이라면 아마 Scanner를 많이 사용할 것이다.

 

BufferedReader에 대해 이야기하기 전에 InputStreamReader에 대해 알아보자


InputStreamReader는 문자열을 한 글자 단위로 읽어들인다. 이 경우 긴 문자열을 읽어 들일 때

불편하고 비효율적이다. BufferedReader란 이 단점은 보완하고자 존재한다.

 

BufferedReaderScanner의 차이는 크게 4가지가 있다.

1. 버퍼 사이즈 2. 동기화 3. 문자열 파싱 4. Exception

- BufferedReader Scanner
버퍼 사이즈  8KB 1KB
동기화 O X
문자열 파싱 읽어 들임 파싱 가능
Exception IOException 던짐 IOException 숨김

 

BufferedReader의 경우 8KB의 버퍼를 가져 버퍼에 입력을 저장하였다가 한 번에 전송하기 때문에 속도가 빠르다

반면 Scanner의 경우 입력이 바로 전달된다.

 

Space와 Enter 모두 경계로 인식하는 Scanner와 달리 BufferedReader는 Enter만을 경계로 인식한다.

 

[속도 비교]

 

 

 


 

[사용 방법]

 

BufferedReaderScanner은 둘 다 공통적으로 System.in을 매개변수로 받는 것을 볼 수 있다.

Scanner sc = new Scanner(System.in); // Scanner의 객체 선언

BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
// BufferedReader의 객체 선언

 

 

BufferedReader를 사용하려면 이와같은 import가 추가적으로 필요하다.

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;

 

그리고 아래와 같이 readLine()이라는 메서드를 활용하고 BufferedReader는 Scanner와 다르게 IOException을 예외처리 해주어야 하기 때문에 throws IOException을 사용한다.

public static void main(String[] args) throws IOException {
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in)); //선언
String s = bf.readLine(); //String
int i = Integer.parseInt(bf.readLine()); //Int

*readLine() 은 리턴값이 String으로 고정되기에 다른 타입으로 입력을 받으려면 형변환이 필요함.

 

 


#BufferedWriter

BufferedWriter란 BufferedReader로 받은 값을 출력하는 방식이다.

BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));   //할당된 버퍼에 값 넣어주기
String s = "abcdefg";   //출력할 문자열
bw.write(s+"\n");   //버퍼에 있는 값 전부 출력
bw.flush();   //남아있는 데이터를 모두 출력시킴
bw.close();   //스트림을 닫음

이 처럼 언언되며 끝에 flush()와 close를 호출해주어야한다. 

 

BufferedReader와 BufferedWriter의 경우 버퍼를 사용하는 입력/ 출력이라 할 수 있다.

 

이 처럼 입력을 읽고 출력하는 과정에서  버퍼를 사용한다.

 

BufferedWriter의 출력은 Scanner와 달리 한번에 모두 출력된다.

 

 


 

[BufferedReader와 BufferedWriter를 활용한 예시]

- 백준 10951번

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.IOException;
import java.util.StringTokenizer;

public class Main{
    public static void main(String[] args) throws IOException{
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st;
        String str;
        while( (str = br.readLine()) != null){
            st = new StringTokenizer(str, " ");
            int a = Integer.parseInt(st.nextToken());
            int b = Integer.parseInt(st.nextToken());
            bw.write(a+b + "\n");
        }
        br.close();
        bw.flush();
        bw.close();
    }
}

 

'자바 [JAVA]' 카테고리의 다른 글

자바의 프로그램 구조와 데이터 타입  (0) 2023.01.26
자바란?  (0) 2023.01.26

댓글