본문 바로가기

기초이론/JAVA

InputStreamReader 와 OutputStreamReader

알고리즘을 풀며 Buffer를 사용하다보니, InputStream / OutputStream 을 쓰는 형태가 대부분이다.

이 둘에 대해서 조금 더 자세히 알아보자.


설명

  • InputStream / OutputStream 은 자바에서 가장 기본이 되는 입 / 출력 스트림이다.
  • Stream 이란 출발지와 도착지를 이어주는 다리이다.

 


  • System.in 은 InputStream 타입의 필드이다.
  • System 클래스의 in 이라는 필드는 InputStream 의 정적 필드이다.
  • InputStream 은 두가지 큰 특징이 있다.
    • 입력받은 데이터는 int 형으로 저장되며 이는 10진수의 UTF-16 값으로 저장된다.
    • 1 byte 만 읽는다.
  • 이러한 문제를 해결하기 위해 확장된 것이 InputStreamReader 이다.
  • InputStreamReader 는 InputStream 를 문자단위(character) 데이터로 변환시키는 중간다리 역할을 한다.
  • InputStreamReader 의 가장 큰 특징으로는 아래의 두 가지가 있다.
    • byte 단위의 데이터를 문자(character) 단위 데이터로 처리할 수 있도록 변환해준다.
    • char 배열로 데이터를 받을 수 있다.
  • 그렇다면 BufferedReader / BufferedWriter 에 InputStreamReader / OutputStreamReader 를 쓰는 이유를 정리해보자면 아래와 같다.
    • InputStreamReader 는 '문자' 를 처리한다.
    • Buffer 는 입력받은 문자열을 쌓아둔 뒤에 한 번에 '문자열' 처럼 출력한다.
    • readLine() 메소드를 사용하면 한 줄 전체를 읽기에 String 으로 받을 수 있다.
    • System.in = inputStream > InputStreamReader 의 과정이며 byte 타입으로 읽는 in을 char 타입으로 변환시켜준다.
  •  Scanner와 BufferedReader 에 속도 차이가 발생하는 이유는 아래와 같다.
    • Scanner 클래스는 입력받은 문자를 정규식들을 검사하고 난 후에 문자열을 반환한다.
    • BufferedReader 클래스는 별다른 정규식을 검사하지 않는다.

사용 형태

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;

public class Main {

	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
		
		String st = "HELLO";
		int T =  Integer.parseInt(br.readLine());
		
		for(int i=0; i<T; i++) {
			bw.write(st);
			bw.write(T + "\n");
		}
		br.close();
		bw.flush();	
		bw.close();	
	}
}

 

'기초이론 > JAVA' 카테고리의 다른 글

BufferedReader 와 Bufferedwriter  (0) 2021.07.18
Scanner  (0) 2021.07.18