InputStreamReader와 BufferedReader

호떡·2022년 8월 10일
0

InputStreamReader

InputStream 은 우리가 InputStream.read() 를 통해 입력을 받으려고 해도 1Byte 만 인식하니 한글은 입력해봤자 읽지도 못하고 엉뚱한 문자만 나온다. 이를 해결하기 위해 우리가 필요한 건 '문자를 온전하게 읽어들이기' 이다. 그리고 이를 위해 확장시킨 것이 InputStreamReader다.

InputStream
1. 입력받은 데이터는 int 형으로 저장되는데 이는 10진수의 UTF-16 값으로 저장된다.
2. 1 byte 만 읽는다.

InputStreamReader
1. 바이트 단위 데이터를 문자(character) 단위 데이터로 처리할 수 있도록 변환해준다.
2. char 배열로 데이터를 받을 수 있다.



BufferedReader

InputStreamReader은 '문자'를 처리한다. '문자열'이 아니다. (그래서 Scanner 에서도 내부에서 임시 배열을 두어 문자열처럼 사용하고 있다.)
InputStreamReader 로 char type 으로 처리할 수 있는 장점은 개선되었지만, 우리가 만약 문자열을 입력하고 싶다면 매번 배열을 선언해야 한다는 단점은 그대로 남아있다. 심지어 입력받을 문자열의 길이가 가변적이라면 더욱 불편하다.
그래서 쓰는 것이 Buffer(버퍼)를 통해 입력받은 문자를 쌓아둔 뒤 한 번에 문자열처럼 보내버리는 것이다. BufferedReader 를 쓸 때 우리는 입력 메소드로 readLine() 을 많이 쓴다. 이 메소드는 한 줄 전체를(공백 포함) 읽기 때문에 char 배열을 하나하나 생성할 필요 없이 String 으로 리턴하여 바로 받을 수 있다는 장점이 있다. 따라서 훨씬 속도가 빠르고 별다른 정규식을 검사하지 않으니 더더욱 속도는 빠를 수밖에 없다.

[System.in = InputStream -> InputStreamReader -> BufferedReader]
byte 타입으로 읽어들이는 in을 char 타입으로 처리한 뒤 String, 즉 문자열로 저장할 수 있게 한다

💡BufferedReader 을 통해 문자열을 받아온 뒤, Integer.parseInt() 같은 파싱 함수들을 통해 타입 변환해주는 것이 특히나 성능(시간) 경쟁인 알고리즘에서는 훨씬 선호 될 수밖에 없다.



✍️정리✍️

InputStream inputstream = System.in;
InputStreamReader sr = new InputStreamReader(inputstream);
BufferedReader br = new BufferedReader(sr);
BufferedReader bc = new BufferedReader(new InputStreamReader(System.in));
  1. 기본적으로 바이트 스트림인 InputStream 을 통해 바이트 단위로 데이터를 입력을 받는다. 또한 System.in 의 타입도 InputStream 이다.

  2. InputStreamReader 은 문자(character) 단위로 데이터를 처리할 수 있도록 돕는다. InputStream 의 데이터를 문자로 변환하는 중개 역할을 한다.

  3. BufferedReader 은 스트림에 버퍼를 두어 문자를 버퍼에 일정 정도 저장해둔 뒤 한 번에 보낸다.

    💡참고 블로그
    💡추가_StringTokenizer

0개의 댓글