PL 문법/JAVA

[JAVA] BufferedReader와 BufferedWriter

jHoon0223 2021. 6. 27. 22:03

JAVA에서 기본적으로 입출력에 사용하는 Scanner는 사용이 편리하고 다양한 타입을 다룰 수 있지만, 속도가 느린 단점이 있다. 따라서, 구현한 프로그램의 시간 복잡도를 줄이기 위해서는 입출력에 Scanner 대신 BufferedReader와 BufferedWriter를 사용하는 것이 좋다.

  사용 속도
Scanner - 사용이 편리
공백과 개행 문자를 경계로 입력 값을 인식
- 입력받을 수 있는 데이터 타입이 다양
느림
BufferedReader - 사용이 번거로움
개행 문자만을 경계로 입력 값을 인식
- 데이터 타입은 String으로 고정
=> 필요한 데이터를 처리하기 위해서는 추가적인 가공 필요
- 예외처리 필요 (try&catch 혹은 throw 이용)
빠름
(입력된 데이터가 바로 전달되지 않고, 버퍼를 거쳐 전달되므로
데이터처리의 효율성이 높아짐)
=> 많은 양의 데이터를
처리할 때 효율적

BufferedWriter도 마찬가지로 버퍼를 거쳐 출력장치로 전달하므로 많은 양의 데이터를 출력할 때 효율적이다.

 

BufferedReader와 BufferedWriter를 사용하려면 다음과 같이 추가적인 import가 필요하다.

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

 

BufferedReader의 경우 다음과 같이 사용한다.

BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(br.readLine());

 

1. readLine() 메소드를 사용한다. 기본 데이터 타입은 String 이기에 위 예시처럼 int형으로 사용하고 싶다면, Integer.parseInt로 형 변환이 필요하다.

2. 따라서 예외 처리가 필요하다.

i) throw 이용 : import java.io.IOException; || public static void main(String[] args) throws IOException {

ii) try & catch 이용

 

한 줄에 둘 이상의 입력을 받을때는, .split()이나 StringTokenizer를 사용한다.

i) .split() 사용

BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String[] str = br.readLine().split(" ");
int N = Integer.parseInt(str[0]);
int M = Integer.parseInt(str[1]);

ii) StringTokenizer 사용

StringTokenizer stk = new StringTokenizer(br.readLine(), " ");
int N = Integer.parseInt(stk.nextToken());
int M = Integer.parseInt(stk.nextToken());

 

 

BufferedWriter의 경우 다음과 같이 사용한다.

BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
for (int a = 0; a < n; a++)
    bw.write(result[a] + " ");
bw.flush();

 

1. write() 메소드를 사용하여 출력 값들을 버퍼에 저장해 두고, flush() 메소드를 사용하여 출력한다.

2. write() 메소드는 개행을 자동으로 지원하지 않는다.

따라서 개행이 필요한 경우, bw.write("\n"); 를 함께 써주어야 한다.

728x90