Java InputStream

습관 들이기·2023년 4월 23일

목적

Java에서 사용하는 InputStream, InputStreamReader, BufferedReader 의 차이와 사용 용도를 파악한다.

Java InputStream

Stream

  • Stream은 마치 물이 연속적으로 흐르는 것과 같이 데이터가 연속적으로 존재한다는 것을 표현한 객체이다.
  • 컴퓨터는 이진수로 이루어진 비트로 정보를 주고 받으며, 일반적으로 바이트코드(byte)로 데이터를 전달하기 때문에 스트림도 byte의 연속된 집합이라고 할 수 있다.
  • 단일 방향으로 연속적으로 흘러간다.

InputStream

  • 바이트 기반 입력 스트림의 최상위 추상클래스다. (모든 바이트 기반 입력 스트림은 이 클래스를 상속받는다.)
  • 파일 데이터를 읽거나 네트워크 소켓을 통해 데이터를 읽거나 키보드에서 입력한 데이터를 읽을 때 사용한다.
  • InputStream은 읽기에 대한 다양한 추상 메소드를 정의해 두었다.
  • InputStream의 추상메소드를 오버라이딩하여 목적에 따라 데이터를 입력 받을 수 있다.
  • 1 byte의 int형의 아스키 코드값으로 값을 저장한다.

InputStreamReader

  • InputStream의 byte 데이터를 char로 전달하여 아스키 코드를 볼 필요가 없다.
  • 공백 단위로 읽기 때문에 한 줄을 다 읽으려면 따로 처리를 해줘야 한다.

BufferedReader

  • InputStream과 InputStreamReader의 단점을 모두 보완하였다.
  • buffer를 두고 파일, 네트워크와 같은 물리적인 장치에서 데이터를 사용자가 요청할 때마다 매번 읽어오는 것이 아닌 일정량사이즈로 한번에 읽어온 후에 버퍼에 보관한다.
  • 보관해놓은 데이터를 사용자가 요청할 때 buffer에서 읽어옵니다.

샘플 코드

InputStream

Code

public void inputStreamTest() throws IOException
{
    InputStream inputstream = System.in;
    int value;
    String result = "";
    while(true)
    {
        value = inputstream.read();
        if(value == 10) break;
        result += (char) value;
    }
    System.out.println(result);
}

Result

image

InputStreamReader

Code

public static void inputStreamReaderTest() throws IOException
{
    InputStream inputstream = System.in;
    InputStreamReader inputStreamReader = new InputStreamReader(inputstream);

    int value;
    String result = "";
    while(true)
    {
        value = inputStreamReader.read();
        if(value == 10) break;
        result += (char) value;
    }
    System.out.println(result);
}

Result

image

BufferedReader

Code

public static void bufferedReaderTest() throws IOException
{
    InputStream inputstream = System.in;
    InputStreamReader inputStreamReader = new InputStreamReader(inputstream);
    BufferedReader bufferedReader = new BufferedReader(inputStreamReader);

    int value;
    String result = "";
    while(true)
    {
        value = bufferedReader.read();
        if(value == 10) break;
        result += (char) value;
    }
    System.out.println(result);
}

Result

image

코드 분석

  1. InputStream에서 숫자와 영어는 정상 출력되지만 한글은 깨진다. 그 이유는 ?
  • InputStream의 read()는 1 byte 씩 읽어오기 때문에 2 byte 이상의 문자를 읽을 경우, 1 byte만 읽고 나머지는 stream에 남겨둔다.
  1. InputStreamReader와 BufferedReader에서는 모든 문자가 정상적으로 나오는 이유는 ? 둘의 차이점은 ?
image
  • InputStreamReader는 byte 스트림을 문자열 스트림으로 변환해준다.
  • 위 코드와 같이 InputStreamRader에서 호출하는 read 의 경우 2 byte 씩 읽어 한글도 처리 가능하게 해준다.
  • InputStreamReader와 BufferedReader 의 차이는 buffer의 유무이다. BufferedReader는 Stream의 데이터를 Buffer에 담아두고 호출시 Buffer에서 데이터를 꺼낸다.
  • Buffer에서 데이터를 꺼내기 때문에 1글자씩 출력 뿐만 아니라 Line 별로도 출력이 가능하다. ( readLine )
profile
오늘보다 나은 내일을 위해 .. !

0개의 댓글