개요
자바를 이용해 푼 백준 문제 풀이를 검색해 보는데, 간단한 문제를 제외하고는 Scanner가 아닌 BufferReader기능을 이용하여 표준입력을 받는 것을 보고 Scanner보다 나은 어떠한 기능이 있는지 알아보기 위해 작성해 본다.
정의
BufferReader : 입력을 읽어주는 기능을 가지고 있는 클래스
java.io의 하위에 정의되어 있는 클래스로, "import java.io.*"을 선언해야 사용이 가능하다.
기능
읽기 성능을 향상하기 위해 입력 스트림의 데이터를 버퍼에 임시로 저장해 둔다.
사용 이유
- 빠른 읽기 속도
: 입력을 버퍼에 임시로 저장해 두는 기능이 있기에 파일 / 네트워크 등 큰 데이터를 읽을 때 성능이 좋다. - 다양한 메서드 : 편리한 메서드가 많이 구현되어 있다.
- read() : 단일 문자를 읽어준다. 읽을 문자가 없을 경우 -1 반환
- read(char[] cbuf, int off, int len) : 지정한 문자 배열의 데이터를 읽어온다.
*off-시작 인덱스, len-읽을 문자 수 - readLine() : 한 줄을 읽어 문자열로 반환하고, 줄의 끝을 만나면 null 반환
- close() : BufferReader을 닫아 자원을 해제한다. (파일을 다 읽으면 자원을 정리해야 함.)
BufferReader 인스턴스 생성하는 방법
: BufferReader은 파일, 문자열, 입력 스트림에서 입력을 받아올 때 사용되는 클래스로, 인스턴스 생성 시 다른 입력 스트림을 매개변수로 전달한다.
- 파일을 읽을 경우 - FileReader 사용
import java.io.BufferedReader; import java.io.FileReader; import java.io.IOException; public class FileReadExample { public static void main(String[] args) { String filePath = "example.txt"; // 읽을 파일의 경로 try (BufferedReader br = new BufferedReader(new FileReader(filePath))) { String line; // 파일에서 한 줄씩 읽어오고 출력 while ((line = br.readLine()) != null) { System.out.println(line); } } catch (IOException e) { // 예외 처리 e.printStackTrace(); } } }
- 문자열을 읽을 경우 - StringReader 사용
import java.io.BufferedReader; import java.io.StringReader; import java.io.IOException; public class StringReadExample { public static void main(String[] args) { String text = "Hello\nWorld\nJava"; // 읽을 문자열 try (BufferedReader br = new BufferedReader(new StringReader(text))) { String line; // 문자열에서 한 줄씩 읽어오고 출력. while ((line = br.readLine()) != null) { System.out.println(line); } } catch (IOException e) { // 예외 처리 e.printStackTrace(); } } }
- 입력 스트림에서 읽는 경우 - InputStreamReader 사용
import java.io.BufferedReader; import java.io.InputStreamReader; import java.io.IOException; public class InputStreamReadExample { public static void main(String[] args) { try (BufferedReader br = new BufferedReader(new InputStreamReader(System.in))) { String line; // 콘솔에서 한 줄씩 읽어오고 출력. System.out.println("Enter some text (Ctrl+D to end):"); while ((line = br.readLine()) != null) { System.out.println("You entered: " + line); } } catch (IOException e) { // 예외 처리 e.printStackTrace(); } } }
Scanner vs BufferReader
Scanner | BufferReader | |
성능 | 데이터의 구분기호를 분석하기에, 상대적으로 더 많은 계산이 필요하다. → 큰 파일을 다룰 때 속도 저하 |
입력을 버퍼에 저장하여 데이터를 한 번에 읽는다. → 입력 속도 up |
기능 | 다양한 데이터 형식 지원 | 주로 문자열을 읽는 데 최적화되어 있다. (cf. 다른 형식의 데이터 처리 시 추가 작업 필요) |
▶ 결론 ◀
다양한 데이터 형식을 다룰 시 Scanner, 다량의 데이터 처리 시 BufferReader 사용이 더 유용하다.
주의사항
- 데이터를 읽어올 때 예외가 발생할 수 있기에, 사용 시 항상 예외처리를 해야 한다. (IOException)
- 버퍼 사용으로 인한 메모리 사용량 증가 → 버퍼의 크기를 경우에 따라 조절할 수 있다.
'Language > JAVA' 카테고리의 다른 글
[Java] var 예약어 (0) | 2024.09.27 |
---|---|
[JAVA] catch-try문 (0) | 2024.09.14 |
[JAVA] throws IOException (0) | 2024.09.13 |
[JAVA] 캐스팅 (Casting) (0) | 2024.09.01 |
[JAVA] 패키지 (Package) (1) | 2024.08.30 |