BufferedReader, BufferedWriter는 Buffer(버퍼)를 사용하여 읽기와 쓰기를 하는 함수이다.
Scanner, System.out.println() 대신에 사용한다.
아래와 같이 버퍼를 사용하면 키보드의 입력값을 버퍼에 한번에 모았다가 버퍼의 내용을 한번에 프로그램에 전달한다.
하드디스크의 속도가 느리고, 외부 장치(키보드, 모니터)와 데이터 입출력도 시간이 오래 걸린다.
그렇기 때문에 입력이 있을 때마다 데이터를 이동시키는 것보다, 중간에 버퍼를 두어 모아두었다가 한번에 보내는 것이 더 효율적이고 빠르다.
☑️ BufferedReader
- 버퍼를 이용한 입력 함수
- Enter(줄바꿈)만 경계로 인식한다.
- 리턴값이 String으로 고정되기 때문에 다른 타입으로 입력받으려면 형변환이 필요하다.
- readline()사용 시마다 예외처리를 반드시 해주어야 한다. → throws IOException
BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); //BufferedReader 선언
String s = br.readLine(); //String
int i = Integer.parseInt(br.readLine()); //Int -> Int형으로 입력받기 위해서 형변환
데이터 가공
Scanner를 통해 읽어온 데이터는 Space(공백), Enter(줄바꿈) 모두를 경계로 입력값을 인식하는 반면,
BufferedReader를 통해 읽어온 데이터는 Enter(줄바꿈) 단위로만 나누어진다.
이것을 Space(띄어쓰기) 단위로 데이터를 가공하기 위해서는 따로 작업해주어야 한다.
이 때, StringTokenizer 클래스를 사용하는 방법, split() 함수를 사용하는 방법이 있다.
//1번째 방법) StringTokenizer 사용
//StringTokenizer의 nextToken()를 사용해서 br.readline()으로 입력받은 값을 공백 단위로 구분
BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); //BufferedReader 선언
StringTokenizer st = new StringTokenizer(br.readLine()); //StringTokenizer 인자값에 입력 문자열 넣음
int a = Integer.parseInt(st.nextToken()); //첫번째 호출
int b = Integer.parseInt(st.nextToken()); //두번째 호출
//2번째 방법) String.split() 사용
//string을 한번에 받아서 split() 함수를 사용해서 배열로 변환
String s = br.readLine();
String array[] = s.split(" "); //데이터를 공백단위로 끊어서 배열에 넣음
☑️ BufferedWriter
- 버퍼를 이용한 출력 함수
- BufferedWriter의 경우 사용 버퍼를 잡아 놓았기 때문에 사용한 후에 반드시 flush() / close()를 호출해주어야 한다.
- BufferedWriter는 System.out.println(); 과 같이 자동 개행 기능이 없기 때문에 newLine() 또는 bw.write("\n") 를 사용한다.
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out)); //BufferedWriter 선언
String s = br.readLine(); //출력할 문자열
bw.write(s); //출력
bw.newLine(); //줄바꿈 -> 또는 bw.write("\n") 사용
bw.flush(); //남아있는 데이터를 모두 출력
bw.close(); //스트림을 모두 닫음
예시 Example
백준 15552번 : 빠른 A+B
https://www.acmicpc.net/problem/15552
import java.io.*;
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));
StringTokenizer st;
int t = Integer.parseInt(br.readLine());
for (int i = 0; i < t; i++) {
st = new StringTokenizer(br.readLine());
int a = Integer.parseInt(st.nextToken());
int b = Integer.parseInt(st.nextToken());
bw.write((a + b) + "\n");
}
bw.flush();
bw.close();
}
}
[참고 블로그]
https://coding-factory.tistory.com/251
https://rlakuku-program.tistory.com/33
'Java' 카테고리의 다른 글
[Java] 오버로딩과 오버라이딩(Overloading & Overriding) (0) | 2024.09.10 |
---|---|
[Java] 자바 Queue에 x, y 값 두 개 삽입(Pair 클래스, Point 클래스) (0) | 2024.08.23 |
[Java] JDK 버전 여러 개 전환하며 사용하기 (0) | 2024.05.13 |
[Java] Math 클래스 (0) | 2024.04.17 |