본문 바로가기

기초 튼튼/코테준비

[코테준비] Java에서 BufferReader와 BufferWriter 활용 입출력

 


1. 언제 쓰이나?

  • Java 교재나 자주 접하는 레퍼런스 코드들을 살펴보면 출력과 입력은 보통 System.out.println을 활용하거나 Scanner를 불러와서 인스턴스를 새로 만들어 입력받는 경우가 대부분이다.
  • 코딩테스트 문제를 자바로 풀다보면 시간제한 초과로 안되는 경우가 존재하는데, 이 경우 BufferReader와 BufferWriter를 활용하여 문제를 해결 가능하다.
  • Buffer를 활용한 두 메서드의 경우 조작 방법이 다소 초기에 번거로운 측면이 있지만 속도 측면에서는 훨씬 빠르다.

 

2. 어떻게 쓰나?

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

public class Main{
    public static void main (String[] args) throws IOException {
        BufferedReader bf = new BufferedReader(new InputStreamReader(System.in)); //읽는 라인  
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out)); //출력 라인  
        
        int x = Integer.parseInt(bf.readLine());
        
        for (int i = 0; i < x; i++) {
        	String s = bf.readLine(); // String으로 라인별로 입력받
        	StringTokenizer st = new StringTokenizer(s);
        	int a = Integer.parseInt(st.nextToken()); //첫번째 호출
        	int b = Integer.parseInt(st.nextToken()); //두번째 호출
        	
        	bw.write(String.valueOf(a+b));
        	bw.newLine();
        }
        bw.flush();
        bw.close();
    }
}
 

 

  • 백준저지의 15552 문제에 대한 정답 코드이다. (문제링크)
  • java.io의 메서드들을 모두 import한다.
  • throws IOException을 추가해줘야 별도의 에러를 보지 않을 수 있다.
  • 입력을 받기 위해서
    • BufferReader를 새로운 변수에 인스턴스로 할당한다.
    • BufferReader 내의 readLine() 메서드를 활용하여 입력을 받는다. 단, readLine()의 경우에는 기존의 nextInt와는 달리 라인별로 인식하며 String으로 결과값을 반환하기 때문에 정수형으로 캐스팅을 해주는 코드를 작성해주어야만 한다.
    • 한 라인에 스페이스로 구분된 여러개의 정수값을 받고 싶을 때는, StringTokenizer를 활용하면 된다. 위 코드는 각 라인별로 두 개의 정수가 스페이스로 구분되어 입력될 때 별도로 구분하여 저장하는 코드이다.
  • 출력을 하기 위해서
    • BufferWriter를 통해 새로운 인스턴스를 생성한다.
    • 생성된 BufferWriter를 통해 write 메서드를 사용하여 출력을 하게된다. println과는 달리 개행이 자동으로 이루어지지 않기 때문에 newLine()을 통해 개행을 해준다.
    • write 메서드 내에 int값이 들어있는 변수를 넣어주면 제대로된 출력값이 나오지 않는다. String만을 제대로 인식하기 때문에 일어나는 현상인데 이 경우 연산이 완료된 정수값을 String으로 캐스팅하여 출력해준다.
  • 끝으로 출력 버퍼를 깨끗하게 해주기 위해서 flush()와 close()를 실행하고 마무리한다.

 

3. 참고한 블로그

 

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

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

coding-factory.tistory.com

 

 

BufferedWriter (Java SE 10 & JDK 10 )

Writes a portion of an array of characters. Ordinarily this method stores characters from the given array into this stream's buffer, flushing the buffer to the underlying stream as needed. If the requested length is at least as large as the buffer, however

docs.oracle.com

 

글 읽기 - 추가 설명 및 다른 언어 빠른 입출력 방법

댓글을 작성하려면 로그인해야 합니다.

www.acmicpc.net

 


 

부족한 블로그에 방문해 주셔서 감사합니다.

잘못된 내용 수정 피드백은 댓글로 적어주세요.

감사합니다 :-)

 

 

 

 

 

반응형