새소식

JAVA (개념, 알고리즘)

BufferedReader와 BufferedWriter

  • -

사용법은 아래와 같다.

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

class Main {
    public static void main(String[] args) throws IOException {
        //입력 시 필요한 BufferedReader
        BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
        String s = bf.readLine();

        // 공백단위로 데이터를 가공하려면 다음과 같은 작업을 해줘야 한다.
        // 1번 방법
        StringTokenizer st = new StringTokenizer(s);
        int a = Integer.parseInt(st.nextToken()); // 첫 번째 인자
        int b = Integer.parseInt(st.nextToken()); // 두 번째 인자

        // 2번 방법
        // 공백마다 값을 구분하여 배열에 저장.
        String arr[] = s.split(" ");


        // 출력 시 필요한 BufferedWriter
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        String str = "abcd"; // 출력하고자 하는 문자열
        bw.write(s); // 출력
        bw.newLine(); // 줄바꿈 (또는 윗줄에서 s+"\n" 형태도 가능하다.)
        bw.flush(); // 남아있는 데이터를 모두 출력하며 버퍼를 비운다
        bw.close(); // 스트림을 닫는다.
    }
}

BufferedReader 는 Scanner과 유사한 개념이고, BufferedWriter은 System.out.println() 과 유사한 개념이다.

이때 Scanner은 버퍼 사이즈가 1024 char이기 때문에, 많은 입력을 필요로 하는 경우에는 성능이 좋지 않다.

이와 다르게 BufferedReader은 8192 char 버퍼 사이즈를 가진다. 또한 이는 개행문자만 경계로 인식하고, 입력받은 data가 String으로 고정된다. 그렇기 때문에 데이터를 따로 가공해서 사용해야 한다.

 

BufferedReader와 BufferedWriter은 입력된 데이터가 바로 전달되지 않고 버퍼를 거쳐 전달되므로 데이터 처리 효율성을 높일 수 있다. 따라서 Scanner와 System.out.println()보다 속도 측면에서 훨씬 빠르며, 많은 양의 데이터를 처리할 때 유용하다.

 

입력은 readLine() 메소드를 이용하는데, String으로 리턴 값이 고정되어 있기 때문에, 다른 타입으로 입력을 받기 위해서는 반드시 형변환이 필요하다. 또한 예외처리를 반드시 해주어야 한다. raedLine()을 사용할 때마다 try/catch문 안에 써줘도 되고, IOException을 통하여 예외처리를 해주어도 된다. (대부분 후자로 이를 처리한다.)

 

공백 단위로 데이터를 가공하려면 StringTokenizerString.split()을 이용한다.

StringTokenizer의 nextToken() 함수를 쓰면 입력 받은 값을 공백 단위로 구분하여 순서대로 호출할 수 있다.

String.split() 함수를 이용하면 공백단위로 끊어 데이터를 배열에 저장하여 사용할 수 있다.

 

BufferedWriter에서는 System.out.println(); 과 같이 개행을 동시에 해주기 않기 때문에, 개행을 하기 위해서는 bw.write("\n");  또는 bw.newLine(); 을 해주어야 한다. 또한, 반드시 사용한 이후에는 flush(), close()를 해주어야 한다. close()를 하게 되면, 출력 스트림을 아예 닫기 때문에 한 번 출력 후, 다른 것도 출력하고자 한다면 flush()를 쓰면 된다.

Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.