[자바] InputStream, OutputStream

hee09·2022년 9월 7일
0

개요

안드로이드에서 블루투스를 통해 기기와 통신을 수행하면 Socket의 InputStream과 OutputStream을 통해서 데이터를 주고 받습니다. 이 개념을 들어본적은 있지만 확실한 정리가 머릿속에 되어 있지 않아서 작성하는 글입니다.


개념

Oracle 자바 공식 도큐먼트 사이트에서 InputStream을 확인하면 다음과 같이 적혀있습니다.

This abstract class is the superclass of all classes representing an input stream of bytes.

문장에 나와있는 Stream과 Byte에 대한 개념을 알아보고 InputStream과 OutputStream을 자세히 알아보도록 하겠습니다.


Stream

InputStream과 OutputStream 모두 Stream이라는 단어가 들어가 있습니다. 스트림이란 실제의 입력이나 출력이 표현된 데이터의 이상화된 흐름을 의미합니다. 즉, 스트림은 운영체제에 의해 생성되는 가상의 연결 고리를 의미하며, 중간 매개자 역할을 합니다. 쉽게 말하자면 데이터가 전송되는 통로로 데이터가 네트워크를 거치건, 파일에서 넘어오건, 키보드로부터 오건, 데이터가 오고가는 통로가 스트림이 되는 것입니다.


Byte

모두 알고있는 개념이지만 컴퓨터는 결국 0과 1로 데이터를 해석합니다. 0과 1로 데이터를 표현하는 한 값을 bit라고 하고, 이러한 bit가 8개 모인 것을 byte라고 합니다. 자바에서 byte 값의 범위는 -127 ~ 128 까지 입니다.


InputStream, OutputStream

위의 두 개념을 가지고 문장을 해석해보면 InputStream의 개념은 바이트 데이터가 들어오는 통로의 역할이 기술된 추상 클래스라고 할 수 있습니다. 즉, 데이터가 파일을 통해서 넘어오건, 키보드를 통해서 넘어오건 바이트 데이터가 넘어오는 통로의 역할을 추상화한 것이라고 생각하면 될 것 같습니다.

OutputStream은 InputStream과는 반대되는 개념으로 바이트 데이터가 나가는 통로의 역할이 기술된 추상 클래스 라고 할 수 있습니다.


InputStream 메서드

이제 InputStream의 주요 메서드를 알아보도록 하겠습니다.

  • public int available(): 현재 입력 스트림에서 읽을 수 있는 바이트 수를 반환합니다.

  • public void close(): 현재 inputStream과 관련된 자원을 반납하고 닫습니다.

  • public void mark(int readlimit): inputStream의 현재 위치를 표시합니다.

  • public void reset(): mark() 메서드가 마지막으로 호출된 시점으로 이동합니다.

  • public boolean markSupported(): inputStream이 mark() 및 reset() 메서드를 지원하는지 확인합니다.

  • public abstract int read(): inputStream에서 한 바이트의 데이터를 일어와 int 타입으로 반환합니다.

  • public int read(byte[] b): inputStream에서 인자로 주어진 바이트 배열의 크기만큼 데이터를 읽어서 b에 저장하고 읽은 바이트 수를 반환합니다.

  • public int read(byte[] b, int off, int len): inputStream에서 최대 len만큼 읽어서 byte[] b의 off위치에 저장하고 읽은 바이트 수를 반환합니다.

  • public long skip(long n): inputStream에서 인자로 주어진 n바이트의 데이터를 건너뛰고 건너뛴 바이트 수를 반환합니다.


OutputStream 메서드

  • public void close(): 현재 outputStream의 자원을 반납하고 닫습니다.

  • public void flush(): 버퍼가 존재하는 경우, 해당 버퍼에 남아있는 데이터를 모두 방출한다.

  • public abstract void write(int b): 인자로 주어진 b의 1바이트 만큼만 outputStream에 씁니다.

  • public void write(byte[] b): 인자로 주어진 바이트 배열의 크기만큼 outputStream에 씁니다.

  • public void write(byte[] b, int off, int len): 인자로 주어진 바이트 배열의 off위치부터 len 크기 만큼의 바이트를 outputStream에 씁니다.


바이트 기반 스트림

InputStream과 OutputStream 추상 클래스를 구현하는 클래스는 다음과 같습니다. 즉, 바이트 단위 입출력을 위한 하위 스트림 클래스에 해당합니다.

입력 스트림출력 스트림입출력 대상
FileInputStreamFileOutputStream파일
ByteArrayInputStreamByteArrayOutputStream메모리
PipedInputStreamPipedOutputStream프로세스
AudioInputStreamAudioOutputStream오디오 장치

문자 기반 스트림

InputStream과 OutputStream이 바이트 단위로 데이터를 입출력을 하는 최상위 스트림 클래스라면, Reader와 Writer는 문자 단위로 데이터를 입출력을 하는 최상위 스트림 클래스입니다. 그리고 이 Reader와 Writer 추상 클래스를 구현하는 하위 스트림 클래스는 다음과 같습니다.

입력 스트림출력 스트림입출력 대상
FileReaderFileWriter파일
CharArrayReaderCharArrayWriter메모리
PipedReaderPipedWriter프로세스
StringReaderStringWriter문자열

결론

InputStream은 데이터를 byte 단위로 읽어들이는 통로이고, OutputStream은 데이터를 byte 단위로 쓰는 통로입니다.

  • InputStream

    • 데이터 읽기(read)
    • 특정 시점으로 되돌아가기(mark, reset)
    • 데이터가 얼마나 남았는지 확인하기(available)
    • 통로 끊기(close)
  • OutputStream

    • 데이터 쓰기(write)
    • 버퍼 비우기(flush)
    • 통로 끊기(close)

참조
Java InputStream, OutputStream
Java InputStream이란?
TCP School - 스트림

틀린 부분은 댓글로 남겨주시면 수정하겠습니다..~~

profile
되새기기 위해 기록

0개의 댓글