BufferedReader, BufferedWriter
버퍼를 이용해 읽고 쓰는 함수
버퍼를 이용해 읽고 쓰기 때문에 입출력 효율이 Scanner, System.out.println(“”) 등 보다 훨씬 좋다.
입력된 데이터가 바로 전달되지 않고 중간에 버퍼링이 된 후에 전달된다.
출력 역시 버퍼를 거쳐 간접적으로 출력장치로 전달되기에 입출력이 효율적이다.
Buffer
데이터를 한 곳에서 다른 곳으로 전송하는 동안 일시적으로 그 데이터를 보관하는 임시 메모리 영역
입출력 속도 향상을 위해 사용
BufferedReader
- 버퍼를 이용한 입력
BufferedWriter
- 버퍼를 이용한 출력
왜? 사용하는데?
하드디스크는 원래 속도가 엄청 느리다. 뿐만 아니라 키보드나 모니터와 같은 외부 장치와의 데이터 입출력은 생각보다 시간이 걸리는 작업이다. 버퍼링 없이 키보드가 눌릴 때마다 눌린 문자의 정보를 목적지로 바로 이동시키는 것보다 중간에 메모리 버퍼를 두어 데이터를 한 데 묶어서 이동시키는 것이 보다 효율적이고 빠르다.
그냥 전송하게 되면 CPU와 성능 갭이 많이 나서 비효율적이다.
흙을 파서 언덕에 버리는데, 한 번 삽질할 때마다 가서 버리는 것보다, 수레에 가득 채워서 한 번에 나르는 것이 효율적인 것과 같은 이치.
즉, 모아뒀다가 한 번에 전송하는게 훨씬 효율적!
BufferedReader
Scanner VS BufferedReader
Scanner를 통해 입력을 받을 경우 Space, Enter를 모두 경계로 인식하기에 입력받은 데이터를 가공하기 매우 편리하다.
하지만 BufferedReader는 Enter만 경계로 인식하고 입력 데이터가 String로 고정되기 때문에 입력받은 데이터를 가공하는 작업이 필요할 경우가 많다.
하지만 많은 양의 데이터를 입력 받을 경우 BufferedReader를 통해 입력받는 것이 효율적
BufferedReader 사용법
BufferedReader 선언 후 readLine() 메소드를 이용해 데이터를 라인 단위로 읽어옴.
readLine()의 리턴 값은 String으로 고정되기에 다른 타입으로 입력을 받으려면 형 변환을 해주어야 한다.
예외처리는 필수
BufferedReader 사용을 위해 throws IOException 이용하거나 try & catch를 활용해 예외처리를 해주어야한다.
아래 코드는 try & catch로 예외처리 한 경우
그냥 BufferedReader만 쓰면 알아서 Eclipse에서 import하라고 경고를 줌(누르면 바로 IOException 적용 가능)
import java.io.*;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) {
try {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String s = br.readLine(); //String
int i = Integer.parseInt(br.readLine()); //int
// br.readLine()으로 읽어온 데이터 가공
// 1. 공백 단위로 구분해 nextToken()을 통해 순서대로 호출
StringTokenizer st = new StringTokenizer(br.readLine());
int T = Integer.parseInt(st.nextToken());
int N = Integer.parseInt(st.nextToken());
String array[] = s.split(" "); // 2. 공백 단위로 데이터 끊어서 배열에 넣음
} catch (IOException e) {
e.printStackTrace();
System.out.println(e.getMessage());
}
}
}
Read 한 데이터는 Line단위로만 나눠지기에 공백 단위로 데이터를 가공하려면 따로 작업을 해야 한다.
첫 번째로 StringTokenizer에 nextToken() 함수를 쓰면 readLine()을 통해 입력받은 값을 공백 단위로 구분해 nextToken()을 통해 순서대로 호출할 수 있다.
두 번째는 String.split() 함수를 이용해 배열에 공백 단위로 끊어서 데이터를 넣어 사용한다.
BufferedWriter
System.out.println(“”);와 같이 데이터를 출력하는 함수이다.
많은 양의 출력에서는 입력과 마찬가지로 Buffer를 활용하기 때문에 효율적이다.
BufferedWriter의 경우 버퍼를 잡아 놓았기 때문에 반드시 flush()를 통해 버퍼에 남아있는 데이터를 모두 출력하고,
close()를 호출해 스트림을 닫아야 한다.
bw.write에는 System.out.println();과 같이 자동 개행 기능이 없기 때문에 개행을 해주어야 할 경우에는 \n를 통해 따로 처리해 주어야 한다.
import java.io.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
String s = "minha";// 출력할 문자열
bw.write(s + "\n"); // 출력
bw.flush(); // 남아있는 데이터를 모두 출력시킴
bw.close(); // 스트림을 닫음
}
}