*** 이 개념은 "이것이 자바다. 신용권의 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를 사용할 수 있다. 그리고 서로 보조 스트림처럼 서로 합쳐서도 사용가능하다.
내용이 방대하다보니 필요할 때마다 찾아보는게 좋겠다.
'개발 > 통신' 카테고리의 다른 글
소켓(Socket) (0) | 2020.05.13 |
---|---|
TCP/IP (0) | 2020.05.07 |
댓글