Java 공부/Java 일반

버퍼드리더 BufferedReader

모항 2022. 1. 13. 18:52

 

지금까지는 입출력을 Scanner와 System.out.print로만 처리하였는데, 어제 동아리 활동 중에 팀원들이 버퍼드리더를 쓰는 것을 보았다.

많은 양의 입출력을 빠르게 처리하는 데 좋다고 한다.

버퍼드라이터도 있으나 일단 버퍼드리더부터 써보려고 한다. 당장 이번 주 과제에 사용해야겠다.

 

설명

Scanner:

공백과 Enter를 모두 데이터를 구분하는 경계로 인식한다.

int, char, String 등 여러 형식으로 데이터를 받아올 수 있다.

 

BufferedReader:

Enter만을 경계로 인식한다.

받아오는 데이터의 형식이 일반적으로 String으로 고정된다.

 

많은 양의 데이터를 받아올 때 효율이 좋고 작업이 단순하다.

그러나 받아온 후 데이터를 쓰기 좋게 가공하는 단계가 필요하다.

 

readLine()와 read():

readLine()은 한 줄을 String 데이터로 가져온다.

read()도 한 줄을 가져오는데, 입력값의 아스키코드를 int형 데이터로 변환하여 가져온다. 즉 1을 입력받으면 '1'의 아스키코드 값인 49를 읽어온다.

 

 

BufferedReader는 Scanner에 비해 속도가 현저히 빠르다는 장점이 있다. 복잡한 알고리즘 문제를 풀다 보면 Scanner에 소요되는 시간 때문에 시간초과가 적잖이 생긴다고 한다. 당장 번거롭더라도 자꾸 써보며 익숙해져야겠다.

 

사용

1. import

java.io.BufferedReader에 있다.

2. 선언

BufferedReader 객체를 생성한다.

3. 사용

입력값을 변수에 저장한다. 이때 바로 형변환을 해줄 수도 있고, 일단 한 줄의 String으로 받아온 뒤 차후에 데이터를 가공할 수도 있다.

 

아래 코드에서는 형변환이 필요 없지만 연습할 겸 형변환까지 해보았다.

 

import java.io.*;

public class Main {

	public static void main(String[] args) throws IOException {
		// TODO Auto-generated method stub

		BufferedReader br = new BufferedReader (new InputStreamReader(System.in));
		
		int a = Integer.parseInt(br.readLine());
		
		System.out.print(a);
		
	}

}

정수 하나를 입력받아 그대로 화면에 출력하는 코드 (입력받으면서 바로 형변환)

 

import java.io.*;
import java.util.StringTokenizer;

public class Main {

	public static void main(String[] args) throws IOException {
		// TODO Auto-generated method stub
		
		BufferedReader br = new BufferedReader (new InputStreamReader(System.in));
		
		int[] arr = new int[3];

		System.out.println("3개의 수를 입력하시오>>");
		
		String str = br.readLine();
		
		StringTokenizer st = new StringTokenizer(str);
		
		for(int i = 0; i<3; i++) {
			arr[i] = Integer.parseInt(st.nextToken());
		}
		
		for(int i = 0; i<3; i++) {
			System.out.println(arr[i]);
		}
		
		
	}

}

BufferedReader로 읽어온 값을 StringTokenizer로 쪼개 arr에 저장한 뒤 화면에 한 줄에 한 개씩 출력하는 코드

 

import java.io.*;

public class Main {

	public static void main(String[] args) throws IOException{
		// TODO Auto-generated method stub
		
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		
		int n = Integer.parseInt(br.readLine());

		int[] nums = new int[n];
		
		String[] temp = br.readLine().split(" ");
		
		for(int i = 0; i<n; i++) {
			
			nums[i] = Integer.parseInt(temp[i]);
			
		}


		
	}

}

StringTokenizer 대신 split()을 활용하여 데이터를 가공하는 코드