자바에서 입력 받을 때 Scanner 클래스로 입력을 받았다. 하지만 속도 측면에서 BufferedReader를 사용하게 되면 훨씬 줄어들 수 있다.
- BufferedReader : Scanner와 유사
- BufferedWriter : System.out.println()과 유사
■ 특징
- 둘은 기존에 쓰던 Scanner와 System.out.println()보다 속도 측면에서 훨씬 빠르다.
- 입력된 데이터가 바로 전달되지 않고 버퍼를 거쳐 전달되므로 데이터 처리 효율성이 높다.
- 많은 양의 데이터를 처리할 때 유리하다.
■ 단점
하지만 그에 비해 BufferedReader은 Enter만 경계로 인식하고, 받은 데이터가 String으로 고정되기 때문에 입력받은 데이터를 가공하는 작업이 필요한 경우가 많다.
■ 주요용어
- Buffer : 데이터를 한 곳에서 다른 하나 곳으로 전송하는동안 일시적으로 그 데이터를 보관하는 임시메모리 영역, 입출력 속도 향상을 위해 버퍼 사용
- Buffer flush : 버퍼에 남아 있는 데이터를 출력시킴(버퍼를 비우는 동작)
- BufferedReader : 버퍼를 이용한 입력
- BufferedWriter : 버퍼를 이용한 출력
■ 사용방법
① import
import java.io.*;로 입력해줘도 된다. (Ctrl + Shift + O)
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
② 주의사항
입력은 readLine()을 활용하는데, 주의해야 할 점이 있다.
첫번째, readLine()의 리턴값은 String이기 때문에 다른 타입으로 입력을 받으려면 형변환을 해줘야 한다. (number 변수를 int로 받기 위해 형변환을 한 것처럼)
두번째, 예외처리를 꼭 해야 한다. readLing()을 할 때마다 try&catch를 활용해도 되지만, 대개 throws IOException을 통하여 작업한다.
import java.io.IOException;
public static void main(String[] args) throws IOException {}
③ BufferedReader
- 데이터 라인 단위로 읽기 가능
- Scanner처럼 공백 단위로 끊어주지 못하고, 엔터만 경계로 인식
- return 값이 String으로 고정되기 때문에 String이 아닌 다른 타입으로 입력받으려면 형변환 해줘야 한다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Example {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String s = br.readLine(); // String
int number = Integer.parseInt(br.readLine()); // int
// 공백구분방법1
StringTokenizer st = new StringTokenizer(br.readLine());
int a = Integer.parseInt(st.nextToken()); // 첫번째 호출
int b = Integer.parseInt(st.nextToken()); // 두번째 호출
// nextToken()을 사용하면 readLine()을 통해 입력받은 값을 공백단위로 구분하여 순서대로 호출
// 공백구분방법2
String array [] = s.split(" "); // 공백마다 데이터 끊어서 배열에 입력
br.close(); // 입출력이 끝난 후 닫기
}
}
④ BufferedWriter
- 한 번에 모았다가 출력 가능
- 버퍼로 정의해줬기 때문에 반드시 flush()/ close()를 호출해줘야 함
- System.out.println()처럼 자동개행 기능이 없으므로 필요한경우 \n을 통해 따로 입력
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.OutputStreamWriter;
public class Example {
public static void main(String[] args) throws IOException {
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
String s = "Hello World"; // 출력할 문자열 선언
bw.write(s); // 출력
bw.newLine(); // 줄바꿈 (출력에서 \n을 입력해도 됨 (bw.write(s + "\n)))
bw.flush(); // 남아있는 데이터 모두 출력
bw.close(); // 스트림 닫음
}
}
'알고리즘 > 공부의흔적' 카테고리의 다른 글
[공부의 흔적]_자바 기본 입출력_System.in.read(); (1) | 2024.12.05 |
---|---|
[공부의흔적]_StringBuilder (1) | 2024.08.15 |