자바/++

[Java] BufferedReader, BufferedWriter

backend dev 2022. 12. 3.

Scanner보다 빠른 입출력 BufferedReader, BufferedWriter

버퍼를 통해서 입출력을 전달해준다.

BufferedReader, BufferedWriter가 Scanner보다 더 효율이 좋은 이유는 버퍼를 이용해서 그렇다고한다.

출처 : https://jhnyang.tistory.com/92

누를때마다 정보를 이동시키는것보다는 중간에 메모리 버퍼를 둬서 데이터를 묶어서 전송시키는것이 효율적이고 빠르다고 한다. 흙을 퍼 나를때 삽으로 한번뜨고 옮기는것보다는 수레에 한번에 담아서 옮기는것이 더 효율적이고 빠른것처럼.

IOException

BufferedReader나 BufferedWriter의 메소드를 사용하려면 

사용할곳에서 try catch를 두르거나 

해당 클래스의 throws IOException처리를 해줘야한다.

public static void main(String[] args)throws IOException {

 

 

BufferedReader

BufferdReader는 엔터(개행문자)로 입력값을 구분한다. ( 공백,스페이스값으로 구분안함)

그리고 받은 데이터는 String으로만 저장되므로 받은 데이터를 사용하려면 형변환을 해야한다.

Integer.parseInt라던지, 공백문자 기준으로 구분하려면 Stringtokenizer를 이용한다던지

 

사용예시

int a = Integer.parseInt(br.readLine()); // 다음과 같이 인트형으로 형변환해서 저장

StringTokenizer st = new StringTokenizer(br.readLine()); // Stringtokenizer에 String값 저장해서 공백기준으로 데이터를 처리가능
while (st.hasMoreTokens()) {
    bw.write(st.nextToken()+"\n"); // 이렇게 하나씩 토큰을 받아서 처리 , write에는 개행이 없으므로 개행문자를 추가해준다.
}

 

readLine()

개행문자가 나오기까지 한줄을 받아주는 메소드

 

read()

입력된값중 맨 앞의 하나만 읽어서 정수형으로 반환해준다.

abcd로 입력했을때 맨앞 a를 'a'로 읽고 '3'의 정수형인 51(아스키코드) 로 반환해준다.

 

반환값 => int

int temp = br.read();
bw.write(temp);
bw.newLine(); // 개행 메소드를 사용해도된다.

위에 코드의 결과

결과해석:

a를 입력해서 65가 temp에 저장되고 bw.write()에 인트값을 넣으면 해당 인트값의 아스키코드문자를 출력해준다.

 

 

BufferdWriter

버퍼를 사용해서 출력하는것이기 때문에 다 사용후에는

꼭 bw.flush -> bw.close 메소드들 순서대로 사용해줘야한다. 그렇지않으면 출력결과가 나타나지않는다.

 

flush()

스트림을 비운다. -> 이게 나오기전까지는 버퍼에 쌓아두고있다가 flush()가 나오면 한번에 출력됨 ( Stringbuilder같은 느낌)

close()

스트림을 닫는다. 닫기전에 flush 해줘야함.

bw.write()

이 메소드는 개행을 해주지않기때문에 개행문자를 같이 사용하거나 개행메소드를 사용하면된다.

개행메소드 -> bw.newLine()

 

write()의 전달인자로는 

 

int형 -> 해당 인트값을 아스키코드값으로 인식하여 하나의 문자를 출력해준다.

ex ) bw.write(65) 를 했을시 A가 출력됨.   

bw.write(65);
bw.newLine(); // 개행 메소드를 사용해도된다.

결과

int값을 그냥 그대로 출력하고싶다면 뒤에 +" "  또는 + "\n"를 추가해주자.

-> 문자열과 + 연산으로 전체를 문자열로 바꿔주는것

bw.write(2 + "");
bw.write(2+"\n");

 

String -> 그대로 출력됨.

 

 

 

 

전체 사용예시

public class prac {
    static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    static BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
    public static void main(String[] args)throws IOException {

        int a = Integer.parseInt(br.readLine()); // 다음과 같이 인트형으로 형변환해서 저장

        StringTokenizer st = new StringTokenizer(br.readLine()); // Stringtokenizer에 String값 저장해서 공백기준으로 데이터를 처리가능
        while (st.hasMoreTokens()) {
            bw.write(st.nextToken()+"\n"); // 이렇게 하나씩 토큰을 받아서 처리 , write에는 개행이 없으므로 개행문자를 추가해준다.
        }

        bw.write(65);
        bw.newLine(); // 개행 메소드를 사용해도된다.


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


    }
}

 

출처, 더 자세한내용

https://jhnyang.tistory.com/92

댓글