BufferedReader와 BufferedWriter는 버퍼를 이용해서 읽고 쓰는 함수이다.
이 함수는 Scanner와 System.out.println()과 기능이 유사하지만 버퍼를 이용하기 때문에 이 함수를 이용하면 입출력의 효율이 올라간다. (속도 측면에서도 훨씬 빠르다.)
그럼 왜 버퍼를 이용하면 속도가 빠를까?
간단하게 생각했을 때 중간에 버퍼를 거치기 때문에 더 느리지 않을까란 생각을 할 수도 있다. 예를 들어 설명하겠다.
모래 사장에서 모래를 퍼서 다른 구역으로 옮긴다고 했을 때 조금씩 여러번 옮기는 것보다 한 곳에 가득 채워서 (버퍼) 한 번에 나르는 것이 더욱 효율적일 것이다. 즉 버퍼를 사용하면 모아두었다가 한 번에 전송하기 때문에 효율적이다.
- buffer
>데이터를 일시적으로 보관하는 임시 메모리 영역
>입출력 속도 향상됨 - buffer flush
>버퍼에 남아 있는 데이터를 출력시킴 (버퍼를 비운다.) - bufferedReader
>버퍼를 이용하여 입력할 때 사용 - bufferedWriter
>버퍼를 이용하여 출력할 때 사용
BufferedReader
Scanner와 기능이 유사하다.
Scanner로 입력받는 경우 띄어쓰기와 개행문자를 경계로 입력 값을 인식하기 때문에 따로 가공할 필요가 없다.
BufferedReader는 엔터만 경계로 인식하기 때문에 받은 데이터가 String으로 고정된다. (무조건 한 줄만 읽는다!!) 때문에 따로 데이터를 가공해야 하는 경우가 많다. 하지만 그럼에도 사용하는 이유는 Scanner에 비해서 상대적으로 빠르다.
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String str = br.readLine(); //String
int i = Integer.parseInt(bf.readLine()); //readLine()시 String으로 반환값이 고정이기 때문에 타입 변환 필수.
br.close(); //입출력이 끝난 후 달아주기
//파일에서 입력받을 경우
FileReader fr = new FileReader("파일");
BufferedReader br_f = new BufferedReader(fr);
//파일 한 줄 씩 읽어서 출력하기
String line="";
for(int i=1; (line = br_f.readLine()) != null; i++){
System.out.println(line);
}
그럼 Scanner 때는 할 수 있었던 공백 단위로 끊어주기는 어떻게 처리할까?
바로 StringTokenize의 nextToken함수를 이용하거나 String클래스의 split함수를 이용하는 방법이 있다.
BufferedWriter
System.out.println(); 과 기능이 유사하다.
위에서 설명한거와 마찬가지로 버퍼를 이용하기 때문에 성능면에서는 더 좋다.
여기서 주의할 점은 write()를 통해 버퍼에 문자를 담고 flush()를 사용하여 버퍼에서 내보내 출력을 해주어야 한다.
BufferedWrite bw = new BufferedWrite(new FileWriter("파일"));
bw.write("hello");
bw.newLine(); //개행
bw.write("wolrd");
bw.flush();
bw.close(); //스트림을 닫아주어야 한다.
주의할 점은 위 버퍼를 사용할 때 예외처리를 해주어야 한다.
예외처리 해주는 방법은 두 가지가 있다.
1) 함수를 사용하는 곳에서 try & catch를 하여 예외처리하는 방법
try{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
}catch (IOException e) {
}
2) main 클래스 옆에 throws IOException을 작성하여 예외처리하는 방법
public static void main(Stirng[] args) throws IOException{
}
'Java' 카테고리의 다른 글
[Java] TCP 네트워킹 - (4)스레드 병렬 처리 (0) | 2022.06.06 |
---|---|
[Java] IO 기반 입출력 - (1)입력 스트림과 출력 스트림 (0) | 2022.06.05 |
[Java] 스트림(stream) (0) | 2021.08.07 |
[Java] 람다식 (Lambda expression) (0) | 2021.08.07 |
[Java]Java.lang 패키지 (Object, System, Class, String, String, Pattern, Arrays, Math, Wrapper) (0) | 2021.08.04 |