Language/JAVA

[JAVA] BufferedReader

굠민 2024. 9. 14. 00:03

 

개요

 

자바를 이용해 푼 백준 문제 풀이를 검색해 보는데, 간단한 문제를 제외하고는 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은 파일, 문자열, 입력 스트림에서 입력을 받아올 때 사용되는 클래스로, 인스턴스 생성 시 다른 입력 스트림을 매개변수로 전달한다. 

  1. 파일을 읽을 경우 - 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();
            }
        }
    }
  2. 문자열을 읽을 경우 - 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();
            }
        }
    }
  3. 입력 스트림에서 읽는 경우 - 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