본문 바로가기
study_algorithm/문제풀면서 알게된 것들

Scanner 와 BufferedReader, 그리고 BufferedWriter

by developer_j 2024. 8. 13.
728x90
반응형

BufferedReader / BufferedWriter 사용 예제

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

public class Main {
    public static void main(String[] args) throws IOException {
        // 1.입력 버퍼 생성
        BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
        String str = bf.readLine();   // readLine(); 으로 읽기
        
        // 2.출력 버퍼 생성
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        bw.write(str + "\n");	// 버퍼에 write. "\n" 은 개행문자
        bw.flush(); // flush = 버퍼를 비우는 역할 = 버퍼의 내용이 목적지로 전송됨
        bw.close(); // close 해야 버퍼 닫힘(자원해제됨).
    }
}

 

1. Scanner 와 BufferedReader의 차이

  • 둘다 버퍼를 사용하지만 Scanner는 버퍼 입력 되자마자 전달 / BufferedReader는 모았다가 전달
  • Scanner 는 1024 char (1024byte,1KB) 을 저장할 수 있고, BufferedReader 는  8192 char (8192byte, 8KB) 를 저장할 수 있다. 따라서 Scanner 가 더 빈번히 비워지므로, 더 많은 시간이 소요된다고 볼 수 있다.
  • Scanner 는 원하는 자료형으로 읽을 수 있지만, BufferedReader 는 String 으로만 읽으므로 알아서 가공해야 함.

 

2. BufferedReader 는 close() 안해도 되고, BufferedWriter 는 close() 해야 하는 이유


BufferedReader 는 GC(garbage colletor)가 알아서 자원해제함.

BufferedWriter 는 close()를 호출 해줘야 GC가 자원해제함.

 

3. BufferedWriter 를 close()만 해줘도 출력은 되는데 flush() 를 해주는 이유

close()에 flush() 호출한다고 api 명세서에 표현되어 있어서 사실상 flush()를 해주지 않아도 되긴 함.

그러나 아래 okky 답변에 나와있는 대로,
어디서 어떻게 close()를 오버라이딩 하는 지 모르고, 그냥 습관 들이는 게 좋다고 한다. 또한, jdk 5 버전까지는 close() 만 호출하면 GC가 자원해제를 하지 못하는 버그가 있었다고 한다.

사과맛오렌지
Writer 클래스의 api에 close가 flush를 호출한다고 명시되어 있기는 합니다.
다만 Closable이나 flushable을 구현체가 한둘이 아닐 것이고, 그것들을 상속받은 놈들이 또 어떻게 오버라이딩을 했을지 모르는 일이기에, 말씀처럼 close와 flush 모두 호출해주는 습관을 들이는 게 좋아 보입니다.


https://okky.kr/questions/1373697

 

OKKY - BufferedWriter Class에서 제공하는 close()메서드

BufferedWriter Class에서 제공하는 close()메서드가 있는데,close()메서드에는 flush()메서드를 포함하고 있다고 알고 있습니다.근데 flush()메서드를 먼저 사용한 후 close()메서드를 사용해야 하는 이유가

okky.kr

 

 


참조글

https://velog.io/@langoustine/Scanner-VS-BufferedReader

 

Scanner vs BufferedReader

Java로 알고리즘 공부를 하고 있는데, 사용자 입출력을 구현할 경우 다양한 입력과 출력 클래스들을 사용할 수 있다. 대표적으로 입력에는 Scanner 클래스, 출력은 sout를 대중적으로 많이 사용하는

velog.io

 

728x90
반응형