안드로이드에서 블루투스를 통해 기기와 통신을 수행하면 Socket의 InputStream과 OutputStream을 통해서 데이터를 주고 받습니다. 이 개념을 들어본적은 있지만 확실한 정리가 머릿속에 되어 있지 않아서 작성하는 글입니다.
Oracle 자바 공식 도큐먼트 사이트에서 InputStream을 확인하면 다음과 같이 적혀있습니다.
This abstract class is the superclass of all classes representing an input stream of bytes.
문장에 나와있는 Stream과 Byte에 대한 개념을 알아보고 InputStream과 OutputStream을 자세히 알아보도록 하겠습니다.
InputStream과 OutputStream 모두 Stream
이라는 단어가 들어가 있습니다. 스트림이란 실제의 입력이나 출력이 표현된 데이터의 이상화된 흐름을 의미합니다. 즉, 스트림은 운영체제에 의해 생성되는 가상의 연결 고리를 의미하며, 중간 매개자 역할을 합니다. 쉽게 말하자면 데이터가 전송되는 통로로 데이터가 네트워크를 거치건, 파일에서 넘어오건, 키보드로부터 오건, 데이터가 오고가는 통로가 스트림이 되는 것입니다.
모두 알고있는 개념이지만 컴퓨터는 결국 0과 1로 데이터를 해석합니다. 0과 1로 데이터를 표현하는 한 값을 bit라고 하고, 이러한 bit가 8개 모인 것을 byte라고 합니다. 자바에서 byte 값의 범위는 -127 ~ 128
까지 입니다.
위의 두 개념을 가지고 문장을 해석해보면 InputStream의 개념은 바이트 데이터가 들어오는 통로의 역할이 기술된 추상 클래스라고 할 수 있습니다. 즉, 데이터가 파일을 통해서 넘어오건, 키보드를 통해서 넘어오건 바이트 데이터가 넘어오는 통로의 역할을 추상화한 것이라고 생각하면 될 것 같습니다.
OutputStream은 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바이트의 데이터를 건너뛰고 건너뛴 바이트 수를 반환합니다.
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 추상 클래스를 구현하는 클래스는 다음과 같습니다. 즉, 바이트 단위 입출력을 위한 하위 스트림 클래스에 해당합니다.
입력 스트림 | 출력 스트림 | 입출력 대상 |
---|---|---|
FileInputStream | FileOutputStream | 파일 |
ByteArrayInputStream | ByteArrayOutputStream | 메모리 |
PipedInputStream | PipedOutputStream | 프로세스 |
AudioInputStream | AudioOutputStream | 오디오 장치 |
InputStream과 OutputStream이 바이트 단위로 데이터를 입출력을 하는 최상위 스트림 클래스라면, Reader와 Writer는 문자 단위로 데이터를 입출력을 하는 최상위 스트림 클래스입니다. 그리고 이 Reader와 Writer 추상 클래스를 구현하는 하위 스트림 클래스는 다음과 같습니다.
입력 스트림 | 출력 스트림 | 입출력 대상 |
---|---|---|
FileReader | FileWriter | 파일 |
CharArrayReader | CharArrayWriter | 메모리 |
PipedReader | PipedWriter | 프로세스 |
StringReader | StringWriter | 문자열 |
InputStream은 데이터를 byte 단위로 읽어들이는 통로이고, OutputStream은 데이터를 byte 단위로 쓰는 통로입니다.
InputStream
OutputStream
참조
Java InputStream, OutputStream
Java InputStream이란?
TCP School - 스트림
틀린 부분은 댓글로 남겨주시면 수정하겠습니다..~~