본문 바로가기
개발/통신

InputStream, OutputStream

by EPdev 2020. 5. 17.
728x90

*** 이 개념은 "이것이 자바다. 신용권의 Java 프로그래밍 정복" 을 보고 정리한 것입니다. ***

 

프로그램에서는 데이터를 외부에서 읽거나 외부로 보내는 일이 매우 많다.

자바에서 데이터는 스트림을 통해 입출력된다.

자연에서 물이 거꾸로 흐를 수 없는 것처럼 스트림은 단방향이다.

하나의 스트림으로 입출력을 다 할수 없다는 것이다.

데이터를 받아오는 게 입력스트림(InputStream)이고

데이터를 보내는 게 출력스트림(OutputStream)이다.

 

스트림 클래스는 크게 두종류이다. 하나는 바이트(Byte) 기반, 하나는 문자 기반

바이트 기반 스트림은 모든 데이터를 바이트로 입출력 가능하나

문자 기반 스트림은 오로지 문자만 입출력이 가능하다.

** 바이트 기반 스트림에 아스키코드로 된 문자가 아닌 유니코드로 된 문자를 보낼 경우 깨지는 현상이 잦다고 한다. 영문자 말고는 사용할 수 없다는 것.. 하지만 문자 기반 스트림은 이를 보완해준다고 하니 참고 **

 

클래스는 아래와 같다.

구분 바이트 기반 스트림 문자 기반 스트림
입력 출력 입력 출력
최상위 클래스 InputStream OutputStream Reader Writer
하위 클래스 @@@InputStream @@@OutputStream @@@Reader @@@Writer
@@@ 에는 File, Data, Object, Buffered 가 들어가며, 별개로 PrintStream 도 있다. @@@ 에는 File, InputStream/OutputStream, Buffered가 들어가며, 별개로 PrintWriter도 있다

여기서 InputStream 과 OutputStream 에 대해서 보자.


InputStream

InputStream은 바이트 기반 입력 스트림의 최상위 클래스이며, 추상 클래스이다.

InputStream을 상속받는 클래스로는 FileInputStream, BufferedInputStream, DataInputStream 이 있다.

InputStream의 메소드로는

리턴 타입 메소드 설명
int read() 입력 스트림에서 1바이트를 읽고 리턴
int read(byte[] b) 입력 스트림에서 읽은 값을 바이트 배열 b에 저장하고 리턴
int read(byte[] b, int offset, int length) 입력 스트림에서 length 개의 바이트를 읽고 b[offset] 부터 length 개까지 저장 후 length개 리턴
void close() 스트림 닫기. (리소스 절약)

OutputStream

OutputStream은 바이트 기반 출력 스트림의 최상위 클래스이며, 추상 클래스이다.

OutputStream을 상속받는 클래스로는 FileOutputStream, PrintOutputStream, BufferedOutputStream, DataOutputStream 이 있다.

OutputStream의 메소드로는

리턴 타입 메소드 설명
void write(int b) 출력 스트림으로 1바이트를 보냄
** int 값이 매개변수로 쓰인다고 int 를 보내는게 아니라 끝에 있는 1바이트만 보냄
void write(byte[] b) 출력 스트림으로 바이트 배열 b의 모든 바이트를 보냄
void write(byte[] b, int offset, int length) 출력 스트림으로 바이트 배열 b[offset]부터 length개의 바이트를 보냄
void flush() 버퍼에 잔류하는 모든 바이트를 출력
void close() 스트림 닫기. (리소스 절약)

FileInputStream/FileOutputStream 은 말 그대로 파일을 입출력할 때 쓰인다.

 

BufferedInputStream/BufferedOutputStream 은 보조 스트림으로 소스와 프로그램을 직접적으로 입출력하게 하는게 아니라 중간에 메모리 버퍼를 주어서 데이터가 여기 모였다가 한번에 입출력하게 해준다. 이로 속도향상의 효과를 누릴 수 있다. (CPU-RAM-HDD 의 관계를 생각) 버퍼의 단위는 8192 바이트이다.

 

DataInputStream/DataOutputStream 은 보조 스트림으로 자바의 기본 데이터 타입인 boolean, char, short, int, long, float, double 으로 입출력하게 해준다.

 

** 그렇다면 여기서 보조 스트림은 무엇인가? 입출력스트림은 기본 스트림에 보조 스트림을 연결할 수 있다. 단순히 기본 입출력스트림만 사용하면 느리거나 제한이 있기 때문에 위 같은 상황에 보조스트림을 사용할 수 있다.

예) 소스 -> 파일 인풋스트림 -> 버퍼드 인풋스트림 -> 프로그램 -> 파일 아웃풋스트림 -> 버퍼드 아웃풋스트림

*** 아웃풋 스트림의 경우 왜 버퍼드가 뒤에 나오나 의아해할 수도 있는데, 코딩할 때 아웃풋 스트림을 먼저 선언해주고 버퍼드 아웃풋스트림에 넣어주기에 이렇게 표현했다. ***


이외의 내용은 필요할 때 찾아보도록 하자.

Input/OutputStream을 사용한 곳 대부분은 Reader/Writer를 사용할 수 있다. 그리고 서로 보조 스트림처럼 서로 합쳐서도 사용가능하다.

내용이 방대하다보니 필요할 때마다 찾아보는게 좋겠다.

728x90

'개발 > 통신' 카테고리의 다른 글

소켓(Socket)  (0) 2020.05.13
TCP/IP  (0) 2020.05.07

댓글