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
반응형
'study_algorithm > 문제풀면서 알게된 것들' 카테고리의 다른 글
String, StringBuffer, StringBuilder (0) | 2020.11.28 |
---|---|
java의 문자열 포맷 : String.format() 과 System.out.printf() (0) | 2020.11.25 |