BufferedReader / BufferWriter

반응형

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{

}

 



 

 

 

반응형