BufferedReader / BufferedWriter는 버퍼를 이용해서 입출력의 효율을 높여준다.
버퍼(buffer)란?
데이터를 한 곳에서 다른 한 곳으로 전송하는 동안 일시적으로 그 데이터를 보관하는 메모리 영역
버퍼링(buffering)은 버퍼를 활용하는 방식 또는 버퍼를 채우는 동작을 말한다.
"버퍼링이 왜 이렇게 느려~" = "저기에서 여기까지 데이터 전송이 왜 이렇게 느려~"
BufferedReader
BufferedReader는 Enter, Spacebar 모두 경계로 인식하는 Scanner와 달리,
Enter만 경계로 인식하고 받은 데이터가 String으로 고정되기 때문에 입력받은 데이터를 가공하는 작업이 필요할 경우가 많다.
그럼에도 불구하고 많은 양의 데이터를 입력받을 경우 BufferedReader를 사용하는 것이 효율성이 높다.
- 사용법
// 선언
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
// 사용
String s = br.readLine();
int i = Integer.parseInt(br.readLine());
1. readLine() 메서드 : 데이터를 라인 단위로 읽음
2. 리턴값은 무조건 String : 다른 타입으로 사용하기 위해서는 형변환 필요
2. readLine을 할때마다 try & catch를 활용하여 예외처리 하거나 throws IOException 필요 : 대부분 throws IOException 사용
- read 데이터 가공
// StringTokenizer 인자값에 입력 문자열 넣음
StringTokenizer st = new StringTokenizer(s);
// 첫 번째 방법
int a = Integer.parseInt(st.nextToken()); // 첫 번째 호출
int b = Integer.parseInt(st.nextToken()); // 두 번째 호출
// 두 번째 방법
String array[] = s.split(" "); // 공백마다 데이터 끊어서 배열에 넣음
StringTokenizer
긴 문자열을 지정된 구분자를 기준으로 문자열을 자를 때 사용
BufferedWriter
일반적으로 출력할 때 System.out.println(""); 방식을 사용한다.
적은 양의 출력일 경우 성능 차이가 미미하겠지만 많은 양의 출력에서는 입력과 마찬가지로 Buffer를 사용하는 것이 효율성이 높다.
- 사용법
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out)); // 선언
String s = "abcdefg"; // 출력할 문자열
bw.write(s); // 출력
bw.newLine(); // 줄바꿈
bw.flush(); // 남아있는 데이터를 모두 출력시킴
bw.close(); // 스트림을 닫음
1. flush()
버퍼를 잡아 놓았기 때문에 남아있는 데이터를 모두 출력시키기 위해 반드시 호출하여 꼭 닫아주기
2. 자동 개행 기능이 없기 떄문에 \n를 통해 따로 처리
예제
package exfor;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.StringTokenizer;
public class Ex4 {
public static void main(String[] args) throws IOException { // BufferedReader는 예외처리 필요
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
int t = Integer.parseInt(br.readLine()); // 테스트 케이스 입력받기
for(int i = 0; i < t; i++) {
StringTokenizer st = new StringTokenizer(br.readLine(), " ");
// br.readLine(), " " : 입력받은 문자열을 공백을 기준으로 나눠라
int num1 = Integer.parseInt(st.nextToken()); // nextToken(): 공백 기준으로 토큰을 반환
int num2 = Integer.parseInt(st.nextToken());
bw.write(num1 + num2 + "\n"); // 출력
}
br.close();
bw.flush();
bw.close();
}
}
3
1 2
2 2
3 3
3
4
6
'JAVA' 카테고리의 다른 글
HashSet (0) | 2020.12.29 |
---|---|
Arrays 클래스 (0) | 2020.12.23 |
JDK / JRE / JVM (0) | 2020.12.17 |
자바 / OOP / 객체 / 클래스 / 인스턴스 / JVM 메모리구조 (0) | 2020.12.17 |
오류(error)와 예외(exception) (0) | 2020.12.10 |