Buffer 라는 개념을 활용하기 때문에, FileReader 보다 더 효율적으로 파일을 읽어올 수 있다.
버퍼를 이용하는 것이 얼핏 보기에는 더 비효율적으로 보일 수도 있지만 한 번에 모아서 처리함으로 인해 빠른 연산이 가능해진다.
예를 들면 땅을 팔 때,
한 번 삽으로 흙을 푼 후 외부로 버리러 가는 것보다
하나의 소쿠리에 흙을 모두 채운 후 한 번에 버리러 가는 것이 더 효율적인 것과 비슷한 개념이라고 보면 될 것이다.
public BufferedReader(Reader in);
//
public BufferedReader(Reader in, int sz);
//
// Reader in = Reader의 객체를 의미한다.
// sz = buffer의 사이즈를 지정하는 것인데, 파라미터로 입력되는 단위는 byte 이다.
// 또한 BufferedReader 의 기본 Buffer 사이즈는 8kb이다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class BufferedReader01 {
public static void main(String[] args) throws IOException {
// 콘솔에서 데이터를 입력할 경우
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
// 텍스트 파일 등에서 데이터를 불러올 경우
FileReader fr = new FileReader('D\java\...txt');
BufferedReader br_f = new BufferedReader(fr);
// readLine을 통해 불러오는 buffer은 기본이 문자형
String s = br.readLine();
// 따라서 정수형 데이터를 사용하려면 형 변환이 필요함
int i = Integer.parseInt(s);
}
BufferedReader 는 줄, 라인 단위로 데이터를 읽는다. 그리고 이렇게 읽혀진 데이터는 String 타입으로 저장된다. 따라서 원하는 데이터 출력이 문자형이 아니라면, 형 변환을 해야만 한다.
또한 BufferedReader 는 예외처리가 필수적이다. 따라서 readline 을 사용할 때 마다 try-catch 를 활용하거나 본문의 throws IOException 을 통해 예외 처리를 한다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class BufferedReader02{
public static void main(String[] args) throws IOException {
// 콘솔에서 입력받을 경우
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
// 파일에서 불러올 경우
FileReader fr = new FileReader('D\java\...txt');
BufferedReader br_f = new BufferedReader(fr);
// buffer의 기본은 문자형
String s = br.readLine(); // 입력을 22 33 로 받음
// StringTokenizer 을 사용할 경우
StringTokenizer st = new StringTokenizer(s);
int a = Integer.parseInt(st.nextToken()); //22
int b = Integer.parseInt(st.nextToken()); //33
String[] arr = s.split(" ");
for (String k : arr) {
System.out.println(k); //22 와 33가 나옴
// split만을 활용하는 경우
String[] Tokens = s.split(" ");
for(int i=0; i<Tokens.length; i++){
System.out.println(Tokens[i]);
}
}
}
}
기억해야 할 것은 bufferedreader 와 Scanner의 차이점은 공백처리의 여부이다. 스캐너는 공백과 개행을 모두 포함하여 개개로 입력을 받지만 버퍼리더의 경우, 공백은 고려대상이 되지 못하여, 개행을 기준으로 출력이 된다.
이 때에는 첫번째로 StringTokenizer 클래스를 이용하고 두번째로 Splite(" ")메소드를 이용해서 입력받은 문자를 나눈다.
이는 기본적으로 System.out.println() 과 동일한 기능을 수행하는 메소드이다.
import java.io.*;
import java.util.StringTokenizer;
public class BufferedWriter {
public static void main(String[] args) throws IOException{
int a = 13579;
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
// BufferWriter 의 경우, 문자형만 출력이 가능하기 때문에, String.ValueOF()로 형변환 필수
bw.write(String.valueOf(a)+"\n");
// bw은 개행이 되지 않기 때문에, 출력에 "\n" 라는 개행코드도 함께 입력
// write를 쓴다고 출력이 되는 것이 아님. write는 버퍼에 입력를 한다는 개념으로 보면 편함
bw.flush();
// flush를 통해서 white가 계속적으로 일어나도록 할 수 있다. 즉 버퍼가 닫히지 않고 계속 열려있도록 한다.
String T = "hi";
bw.write(T+"\n");
bw.close();
// 최종적으로 close를 입력해야지만 출력이 완료됨.
참고예제