Programming-[Backend]/Java

자바 입력 : InputStream, InputStreamReader, BufferedStream, Scanner

컴퓨터 탐험가 찰리 2022. 6. 2. 22:21
728x90
반응형

 

자바의 기본 입력 API인 InputStream 등에 대해서 학습한다. 참조1의 설명이 잘 나와있어서, 그대로 따라해보며 기록 하였다.

 

 

1. Stream

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

 

사용자의 키보드 입력, 파일 데이터, HTTP 송수신 데이터 등이 모두 스트림으로 간주되어 스트림 관련 API를 통해서 데이터를 처리하게 된다.

 


 

2. InputStream

 

InputStream은 1996년 JDK 1.0에서 도입되었다. java.io 패키지에 속해 있다. InputStream의 특징은 다음과 같다.

 

1 byte의 int형의 아스키 코드값으로 값을 저장한다.

InputStream 객체를 상속받는 System.in의 read() 메서드를 통해서 값을 입력받을 수 있다.

 

아래 코드를 main 메서드에 입력 후, 콘솔창에 a라는 문자를 입력하고 Enter를 누르면 아스키코드 값인 97이 출력되는 것을 확인할 수 있다.

public class Sample {
    public static void main(String[] args) throws IOException {
        InputStream in = System.in;

        int a;
        a = in.read();

        System.out.println(a);
    }
}

 

 

 

만약 콘솔창에서 abc를 입력하더라도 맨 앞의 "a"에 해당하는 아스키 코드값 97만 출력된다. 왜냐하면 바이트코드를 저장할 수 있는 스트림 데이터를 int로 정의했기 때문이다. 만약 아래와 같이 byte 배열로 지정한다면, 그 길이만큼 바이트를 받을 수 있다.

 

 

만약 아래처럼 길이가 3 바이트인 byte array를 지정하고 read 메서드를 실행하면, abc, 즉 3바이트까지 읽어들일 수 있는 것을 확인할 수 있다.

public class Sample {

  public static void main(String[] args) throws IOException {

    InputStream inputStream = System.in;

    byte[] bytes = new byte[3];
    inputStream.read(bytes);

    System.out.println(bytes[0]);
    System.out.println(bytes[1]);
    System.out.println(bytes[2]);
    
  }
}

 

 

 


 

3. InputStreamReader

 

 

inputStreamReader는 byte 대신 char 형태로 읽을 수 있다. 따라서 아스키코드가 아닌 문자열로 출력이 가능하며, String 객체로 변환할 수도 있게 된다. inputStream을 인자값으로 받아와서 만들어진다.

 

public class Sample {

  public static void main(String[] args) throws IOException {

    InputStream inputStream = System.in;
    InputStreamReader reader = new InputStreamReader(inputStream);

    char[] chars = new char[3];
    reader.read(chars);

    System.out.println(chars);
  }
}

 

 

HTTP 서버의 응답값 불러오기

단순히 사용자의 입력만 불러올 수 있는 것이 아니라, HTTP 서버의 응답값도 불러올 수 있다. 많은 라이브러리와 객체가 있지만 가장 기본이 되는 URLConnection 객체를 사용하는 예제를 살펴보자.

 

@Component
@RequiredArgsConstructor
@Slf4j
public class UrlComponent1 {

  private final URLConnection urlConnection1;

  //페이지 출력하기
  public void printPage() throws IOException {
    InputStream inputStream = urlConnection1.getInputStream();
    InputStreamReader reader = new InputStreamReader(inputStream);

    char[] chars = new char[4096];
    reader.read(chars);

    while((reader.read(chars) != -1)) {
      String s = new String(chars);
      log.info("s = {}", s);
    }
  }
}

 

urlConnection의 getInputStream() 메서드를 이용해서 InputStream을 불러오고, HTTP Connection을 통해서 InputStream에 서버의 응답값을 불러오는 예제이다. 여기서는 HTTP 서버 연결 정보나 설정 정보는 생략하였다. 이를 이용하여 네이버에 요청을 보내면 chars에 응답값이 담겨서 log.info를 통해 콘솔에 응답값이 호출된다.

 

 

[탐험][자바 스프링 Http 통신하기] 1. URL Connection

 


 

 

4. BufferedReader

 

 

상기 클래스들이 받아올 입력값의 길이 정보를 지정해줘야 했다면, BufferedReader는 \n과 같이 새로운 줄이 생기기 전(엔터 입력 전)까지 또는 내용이 너무 길어서 Stream이 꽉차서 null을 반환하기 전까지 모든 값을 저장한다.

 

inputStream -> inputStreamReader -> BufferedReader로 차례대로 인자값으로 받아와서 사용해야한다. 그리고 readLine()이라는 메서드를 사용한다.

 

public class Sample {

  public static void main(String[] args) throws IOException {

    InputStream inputStream = System.in;
    InputStreamReader reader = new InputStreamReader(inputStream);
    BufferedReader br = new BufferedReader(reader);

    String s = br.readLine();

    System.out.println(s);
  }
}

 

InputStream부터 인자값을 받아가며 처리해야되서 다소 복잡하지만, 많은 데이터를 입력받는 경우에는 아래 기술한 Scanner보다 메모리 사용면에서 효율적이라고 한다.

 


 

 

5. Scanner

 

Scanner는 2004년 J2SE 5.0에 java.util.Scanner 클래스가 새로 추가되면서 등장했다. System.in을 인자로 받는다. 메서드별 처리 데이터를 구분한다.

 

  • next() : 단어 1개
  • nextLine() : 라인 1줄
  • nextInt() : 정수값만 읽는다. 문자를 입력하면 InputMismatchException을 반환한다.
public class Sample {

  public static void main(String[] args) throws IOException {

    Scanner sc = new Scanner(System.in);
    System.out.println(sc.next());

  }
}

next로 실행 시
nextLine으로 실행 시

 

nextInt 실행


참조

 

1. 점프 투 자바 - 콘솔 입출력

https://wikidocs.net/226

 

 

 

728x90
반응형