본문 바로가기
Java

[Java] 빠른 입출력 BufferedReader & BufferedWriter

by nyrimmm 2024. 6. 19.

BufferedReader, BufferedWriter는 Buffer(버퍼)를  사용하여 읽기와 쓰기를 하는 함수이다.

 

Scanner, System.out.println() 대신에 사용한다.

 

아래와 같이 버퍼를 사용하면 키보드의 입력값을 버퍼에 한번에 모았다가 버퍼의 내용을 한번에 프로그램에 전달한다.

 

 

하드디스크의 속도가 느리고, 외부 장치(키보드, 모니터)와 데이터 입출력도 시간이 오래 걸린다.

그렇기 때문에 입력이 있을 때마다 데이터를 이동시키는 것보다, 중간에 버퍼를 두어 모아두었다가 한번에 보내는 것이 더 효율적이고 빠르다.

 

 

 

☑️ BufferedReader

  • 버퍼를 이용한 입력 함수
  • Enter(줄바꿈)만 경계로 인식한다.
  • 리턴값이 String으로 고정되기 때문에 다른 타입으로 입력받으려면 형변환이 필요하다.
  • readline()사용 시마다 예외처리를 반드시 해주어야 한다. → throws IOException
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));   //BufferedReader 선언

String s = br.readLine();   //String
int i = Integer.parseInt(br.readLine());    //Int -> Int형으로 입력받기 위해서 형변환

 

 

데이터 가공

Scanner를 통해 읽어온 데이터는 Space(공백), Enter(줄바꿈) 모두를 경계로 입력값을 인식하는 반면, 

BufferedReader를 통해 읽어온 데이터는 Enter(줄바꿈) 단위로만 나누어진다.

이것을 Space(띄어쓰기) 단위로 데이터를 가공하기 위해서는 따로 작업해주어야 한다. 

이 때, StringTokenizer 클래스를 사용하는 방법, split() 함수를 사용하는 방법이 있다.

//1번째 방법) StringTokenizer 사용
//StringTokenizer의 nextToken()를 사용해서 br.readline()으로 입력받은 값을 공백 단위로 구분
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));   //BufferedReader 선언
StringTokenizer st = new StringTokenizer(br.readLine());    //StringTokenizer 인자값에 입력 문자열 넣음

int a = Integer.parseInt(st.nextToken());   //첫번째 호출
int b = Integer.parseInt(st.nextToken());   //두번째 호출



//2번째 방법) String.split() 사용
//string을 한번에 받아서 split() 함수를 사용해서 배열로 변환
String s = br.readLine();
String array[] = s.split(" ");   //데이터를 공백단위로 끊어서 배열에 넣음

 

 

 

 

 

☑️ BufferedWriter

  • 버퍼를 이용한 출력 함수
  • BufferedWriter의 경우 사용 버퍼를 잡아 놓았기 때문에 사용한 후에 반드시 flush() / close()를 호출해주어야 한다.
  • BufferedWriter는 System.out.println(); 과 같이 자동 개행 기능이 없기 때문에 newLine() 또는 bw.write("\n") 를 사용한다.
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));	//BufferedWriter 선언

String s = br.readLine();   //출력할 문자열

bw.write(s);    //출력
bw.newLine();   //줄바꿈 -> 또는 bw.write("\n") 사용
bw.flush(); //남아있는 데이터를 모두 출력
bw.close(); //스트림을 모두 닫음

 

 

 

 

 

 

예시 Example

백준 15552번 : 빠른 A+B

https://www.acmicpc.net/problem/15552

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

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));
        StringTokenizer st;

        int t = Integer.parseInt(br.readLine());

        for (int i = 0; i < t; i++) {
            st = new StringTokenizer(br.readLine());
            int a = Integer.parseInt(st.nextToken());
            int b = Integer.parseInt(st.nextToken());
            bw.write((a + b) + "\n");
        }

        bw.flush();
        bw.close();
    }
}

 


[참고 블로그]

https://coding-factory.tistory.com/251

 

[Java] BufferedReader, BufferedWriter를 활용한 빠른 입출력

BufferedReader/BufferedWriter는 Buffer에 있는 IO 클래스입니다. 입력된 데이터가 바로 전달되지 않고 중간에 버퍼링이 된 후에 전달되됩니다. 출력도 마찬가지로 버퍼를 거쳐서 간접적으로 출력장치로

coding-factory.tistory.com

 

https://rlakuku-program.tistory.com/33

 

[Java] 빠른 입출력을 위한 BufferedReader, BufferedWriter, StringTokenizer, StringBuilder

BufferedReader / BufferedWriter BufferedReader와 BufferdWriter는 버퍼를 사용하여 읽기와 쓰기를 하는 함수이다. 버퍼를 사용하지 않는 입력은, 키보드의 입력이 키를 누르는 즉시 바로 프로그램에 전달된다.

rlakuku-program.tistory.com