[알고리즘 BufferedReader 와 InputStreamReader 는 어떤 역할로 사용하는 것인가]

박상준·2024년 6월 10일
0

JAVA

목록 보기
5/5
post-custom-banner
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
  • 먼저 System.in 부터 구조를 분해해보자.
        /**
         * The "standard" input stream. This stream is already
         * open and ready to supply input data. Typically this stream
         * corresponds to keyboard input or another input source specified by
         * the host environment or user.
         */
        public static final InputStream in = null;
    • 해당 InputStream 으로 콘솔 입력을 받는 것으로 보인다.

    • System 클래스에는

      initPhase1 라는 초기화 함수가 존재하는데
      
      FileInputStream fdIn = new FileInputStream(FileDescriptor.in);
      FileOutputStream fdOut = new FileOutputStream(FileDescriptor.out);
      FileOutputStream fdErr = new FileOutputStream(FileDescriptor.err);
      setIn0(new BufferedInputStream(fdIn));
    • FileInputStream 을 통하여 File 을 읽어들인다고 볼 수 있다.

      • FIS 는 기본적으로 File 을 읽지만, FileDescriptor.in(표준입력) 을 매개변수로 받으면서
      • 키보드 입력을 받게 된다.
  • 다음 InputStreamReader 는 바이트 스트림을 문자 스트림으로 변환하는 데 사용되는 브리지 클래스이다.
    • System.in 에서 입력받은 데이터는 바이트기 기반 입력 스트림으로서, 사람이 이해할 수 없는 형태로 기록되어 있는 상태이다.
    • 그것을
      public InputStreamReader(InputStream in) {
          super(in);
          sd = StreamDecoder.forInputStreamReader(in, this,
                  Charset.defaultCharset()); // ## check lock object
      }
      • 에서 디코딩을 통해, 기본 charset 을 통해 인간이 알아먹을 수 있는 문자로 변환해주는 역할이다.
      • 자바 11의 경우 기본적으로 UTF_8 을 채택하였다.
      • 아마 이전 자바의 경우 UTF_8 이 아니라, EUC-KR 였나 그랬던 것 같다.
  • 다음 BufferedReader
    public BufferedReader(Reader in) {
        this(in, defaultCharBufferSize);
    }
    • *defaultCharBufferSize = 8192*
      - 사이즈를 가진다.

         public BufferedReader(Reader in, int sz) {
              super(in);
              if (sz <= 0)
                  throw new IllegalArgumentException("Buffer size <= 0");
              this.in = in;
              cb = new char[sz];
              nextChar = nChars = 0;
          }
    • 내부적으로 char[버퍼사이즈] 의 크기를 버퍼링을 수행한다.

  • 내부적으로 한글인지 영어인지 바이트 스트림만으로 어떻게 구별하나
    • 인코딩과 디코딩으로 별도 규약을 설정함.
    • UTF-8 의 인코딩과 디코딩
      • 한글 를 UTF-8 로 인코딩 ( 문자를 바이트스트림으로)
      • 유니코드 : U+AC00
      • UTF-8 인코딩 : EAB080 ( 16진수) , 이진수로는 11101010 10110000 10000000 라고함.
    • 영어 A 의 바이트 스트림
      • 유니코드 : U+0041
      • UTF-8 인코딩 : 41 (16진수)
      • 이진수 : 01000001
    • 인코딩을 어떤 방식으로 했으면 다른 디코딩 방식을 택하는 경우 문자가 제대로 읽지않을 가능성이 농후함.
profile
이전 블로그 : https://oth3410.tistory.com/
post-custom-banner

0개의 댓글