[Java] BufferedReader와 BufferedWriter
1. Buffer
- 코딩테스트와 같이 실행 속도와 같은 효율을 고려해야하는 경우, IO를 대부분 Scanner와 System.out.println보다는 BufferedReader와 BufferedWriter를 사용함
- 버퍼(Buffer) : 데이터를 어떤 지점에서 다른 지점으로 전송하는동안 일시적으로 데이터를 보관하는 메모리의 영역
- Buffer를 사용하는 이유
(1) Buffer를 사용하지 않는 경우, 사용자가 입력하는 즉시 프로그램에 전달됨 (성능저하)
(2) Buffer를 사용하는 경우, 사용자가 입력을 마칠 때까지 Buffer에 담아뒀다가 입력이 끝나면 한꺼번에 프로그램으로 전달
- Stream을 사용하기 때문에 예외처리가 요구됨
(1) try-catch를 사용함
(2) 메서드에 throws IOException 처리
2. BufferedReader
- JDK 1.5 이후 추가된 Scanner와 같은 기능을 하는 객체
- 짧은 문자열일 경우 Scanner가 효율적이지만, 긴 문자열일 경우 BufferedReader를 사용하는 것이 시간을 줄여줌
- readLine()를 사용하여 한 줄씩 읽어들임
- 단, String으로만 인식하기 때문에 형변환 필요 (Scanner는 다양한 타입 가능)
- close()를 호출해줘야 함
import java.io.*;
import java.util.Scanner;
public class Main {
public static void main(String[] args) throws IOException {
// (1) BufferedReader 사용
BufferedReader br = new BufferedReader(new InputStreamReader(System.in);
String str = br.readLine();
br.close();
// (2) Scanner 사용
Scanner sc = new Scanner(System.in);
String str2 = sc.nextLine();
int n = sc.nextInt();
sc.close();
}
}
3. BufferedWriter
- System.out.println()과 같은 기능을 하는 객체
- 출력할 값을 buffer에 담아두었다가 한꺼번에 출력을 함
- append()로 데이터를 buffer에 추가
- 개행처리를 위해서 직접 "\n"과 같은 문자열을 추가해줘야 함
- flush()로 데이터를 프로그램에 전달
- close()를 호출해줘야 함 (close()는 내부적으로 flush()를 호출하기 때문에 flush()와 중복할 필요는 없음)
import java.io.*;
public class Main {
public static void main(String[] args) throws IOException {
// (1) BufferedWriter 사용
BufferedWriter bw = new BufferedWriter(new OutputStreamReader(System.out);
bw.append("Hello ");
bw.append("World\n");
bw.flush(); // close() 있으면 생략 가능
bw.close();
// (2) System.out.println 사용
System.out.println("Hello World");
}
}
4. 예외처리
- 두 가지 방법으로 예외처리 가능
(1) try-catch 사용
import java.io.*;
public class Main {
public static void main(String[] args) {
BufferedReader br;
BufferedWriter bw;
try {
br = new BufferedReader(new InputStreamWriter(System.in);
bw = new BufferedWriter(new OutputStreamReader(System.out);
...
} catch(IOException e) {
e.printStackTrace();
} finally {
if (bw != null) {
try {
bw.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
(2) IOException 처리
import java.io.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamWriter(System.in);
BufferedWriter bw = new BufferedWriter(new OutputStreamReader(System.out);
....
}
}