JAVA - 입력받기 ( BufferedReader )
- Java BufferedReader 클래스로 입력받기
BufferedReader 클래스
Scanner 클래스는 공백, 줄바꿈도 모두 입력값의 경계로 인식하므로,
입력받은 즉시 자료형이 확정되기에 BufferedReader에 비해 편리함
BufferedReader 클래스는 라인단위로 입력을 받고
줄바꿈만을 입력값의 경계로 인식하며 입력값은 모두 String타입이다.
때문에 하나하나 타입변환을 해주어야하며
또한 한줄에 여러 값이 입력되어있다면 파싱이 필수적이다.
게다가 BufferedReader는 Scanner와 다르게 자체적으로 Exception에 대한
처리가 되어있지 않기때문에 throws Exception이나 try - catch를 이용해 예외를 따로 처리해주어야한다.
그럼에도 불구하고 BufferedReader를 사용하는 이유는
Scanner와 다르게 하나하나씩 전달하지않고 버퍼에 한번에 모아서 전달하는
BufferedReader클래스가 속도면에서 빠르고 효율적이기 때문이다.
1. import 선언
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
Scanner를 사용할 때에는 java.util 패키지를 import하지만
BufferedReader 는 java.io 패키지를 import해야한다.
2. 예외처리
public static void main(String[] args) throws IOException {
BufferedReader는 Scanner와 다르게 자체적으로 Exception에 대한
처리가 되어있지 않기때문에 throws Exception이나 try - catch를 이용해 예외를 따로 처리해주어야한다.
3. 버퍼리더 객체생성
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter br = new BufferedWriter(new OutputStreamWriter(System.out));
입력값을 받을 BufferedReader 객체와, 출력값을 저장할 BufferedWriter객체를 생성
4. 입력받기
// 개행을 경계값으로 라인단위 입력받기
String str = br.readLine();
// 정수형입력하려면, 형변환
int i = Integer.parseInt(br.readLine());
✅ br.readLine 한줄이 숫자 하나 예를들어 "100" 이면 형변환되지만
❗ "100 123" 이렇게 입력되어있다면 형변환불가능
// 한줄에 값이 여러개라 공백을 기준으로 잘라야할 때.
String arr[] = str.split(" ");
// arr 배열에 공백을 기준으로 잘라 인덱스에 한값씩 저장
// 혹은 StringTokenizer 사용해도 가능
입력값을 읽어올 때 대부분 readLine()을 사용하며, 생성했던 객체를 이용해 readLine 메소드에 접근해 변수를 저장
5. 출력하기
// 출력
bw.writer(str);
// 개행
bw.newLine();
// 담고있는 데이터 쏟아내기
bw.flush();
// 스트림종료
bw.close();
쓸 때는 주로 write()를 사용하는데, 줄바꿈이 포함되어있지 않기때문에, 개행하고싶다면 newLine()을 호출해야함
백준 15552 빠른 A+B
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 Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
// 테스트케이스의 개수
int N = Integer.parseInt(br.readLine());
StringTokenizer st;
for (int i = 0; i < N; i++) {
st = new StringTokenizer(br.readLine()," "); // 공백을 구분자로 분리
bw.write((Integer.parseInt(st.nextToken()) + Integer.parseInt(st.nextToken()))+ "\n");
}
br.close();
bw.flush();
bw.close();
// 거의 필수적으로 버퍼를 비운(flush)뒤 닫아(close)줘야한다.
}
}
. 각 메소드
대표적으로 사용되는 메소드의 종류들
클래스 | 메소드 | 리턴타입 | 작동방식 |
BufferedReader | read() | int | 문자 하나를 읽어 int형으로 리턴. |
readLine() | String | 한 줄의 문자열을 읽음 | |
skip(n) | long | n개의 문자를 스킵하고 넘어간다. | |
BufferedWriter | write(s) | - | 문자 또는 문자열 s를 출력한다. |
newLine() | - | 빈 줄을 작성한다. | |
flush() | - | 남은 값들을 모두 출력시킨다. | |
close() | - | 스트림을 종료한다. |
❗ 주의사항
1) BufferedReader의 read()와 readLine()은 리턴타입이 다르기 때문에 구분해서 사용해야 한다.
read()는 문자를 읽어 그에 해당하는 ASCII 10진수 정수를 반환하기 때문에, 숫자를 바로 입력받을 수 있다고 생각하면 안됨.
2) 숫자를 입력받고 싶다면, readLine()으로 string으로 읽어온 후 parseInt() 메소드를 이용해 int형으로 변환할 수 있다.
3) BufferedWriter의 write 메소드는 문자열만 작성할 수 있으므로, 숫자를 작성하고 싶다면 toString 메소드를 이용해 먼저 문자로 변환해야 한다.
4) BufferedWriter 객체는 반드시 flush() 또는 close()를 해서 스트림을 끝내야 한다.
5) BufferedReader와 BufferedWriter 클래스의 메소드들은 입출력에러가 발생할 경우 자체적으로 IOException을 던지도록 정의되어있다.
그러므로 이 메소드들을 사용할 때 반드시 예외처리를 해주어야 한다.