일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- 자바
- 데이터문서포맷
- Session
- XML DOM
- JSP
- Ajax
- Database
- JavaScript
- xml
- 스프링프레임워크
- Servlet
- 카카오APi
- java annotation
- java컴파일
- XML Core
- HTTP
- 반응형웹
- 데이터베이스
- 데이터포맷
- JSTL
- 프로그래밍용어
- 공문서작성규정
- 세션
- 웹프로그래밍
- xml mapping
- Multipart
- Java
- 자바스크립트
- 데이터규정
- Request/Response Header
- Today
- Total
KyungHwan's etc.
자바 입출력( I / O) 과 스트림(Stream) 본문
스트림(stream)
자바에서는 파일이나 콘솔의 입력을 직접 다루지 않고, 스트림(Stream) 이라는 흐름을 통해 다룬다.
스트림이란 어떤 실제의 입력이나 출력의 흐름을 이야기 하는데, 즉 스트림이란 운영체제에 의해 생성되는 가상의 연결고리를 의미하며, 중간의 매개자 역활을 한다.
입출력 스트림
스트림은 한 방향으로만 통신할 수 있으므로, 입력과 출력을 동시에 처리 할수는 없다.
따라서 스트림은 사용 목적에 따라 입력 스트림과 출력 스트림으로 구분된다.
자바에서는 java.io 패키지를 통해 InputStream과 OutputStream 클래스를 별도로 제공하고 있다.
즉, 자바에서의 스트림 생성이란 이러한 스트림 클래스 타입의 인스턴스를 생성한다는 의미입니다.
InputStream 클래스에는 read() 메소드가, OutputStream 클래스에는 write() 메소드가 각각 추상 메소드로 포함되어 있습니다.
사용자는 이 두 메소드를 상황에 맞게 적절히 구현해야만 입출력 스트림을 생성하여 사용할 수 있다.
클래스 | 메소드 | 설명 |
---|---|---|
InputStream | abstract int read() | 해당 입력 스트림으로부터 다음 바이트를 읽어들임. |
int read(byte[] b) | 해당 입력 스트림으로부터 특정 바이트를 읽어들인 후, 배열 b에 저장함. | |
int read(byte[] b, int off, int len) | 해당 입력 스트림으로부터 len 바이트를 읽어들인 후, 배열 b[off]부터 저장함. | |
OutputStream | abstract void write(int b) | 해당 출력 스트림에 특정 바이트를 저장함. |
void write(byte[] b) | 배열 b의 특정 바이트를 배열 b의 길이만큼 해당 출력 스트림에 저장함. | |
void write(byte[] b, int off, int len) | 배열 b[off]부터 len 바이트를 해당 출력 스트림에 저장함. |
read() 메소드는 해당 입력 스트림에서 더 이상 읽어들일 바이트가 없으면, -1을 반환한다.
그런데 반환 타입을 byte 타입으로 하면, 0부터 255까지의 바이트 정보는 표현할 수 있지만 -1은 표현할 수 없게 된다. 따라서 InputStream의 read() 메소드는 반환 타입을 int형으로 선언하고 있다.
바이트 기반 스트림
자바에서 스트림은 기본적으로 바이트 단위로 데이터를 전송한다.
자바에서는 다음과 같은 다양한 바이트 기반의 입출력 스트림을 제공한다.
입력 스트림 | 출력 스트림 | 입출력 대상 |
---|---|---|
FileInputStream | FileOutputStream | 파일 |
ByteArrayInputStream | ByteArrayOutputStream | 메모리 |
PipedInputStream | PipedOutputStream | 프로세스 |
AudioInputStream | AudioOutputStream | 오디오 장치 |
이트 스트림의 구성도
△ 입력 바이트 스트림은 InputStream라는 단어가 붙어있다.
보조 스트림
자바에서 제공하는 보조 스트림은 실제로 데이터를 주고 받을수는 없지만, 다른 스트림의 기능을 향상시키거나 새로운 기능을 추가해주는 스트림이다.
입력 스트림 | 출력 스트림 | 설명 |
---|---|---|
FilterInputStream | FilterOutputStream | 필터를 이용한 입출력 |
BufferedInputStream | BufferedOutputStream | 버퍼를 이용한 입출력 |
DataInputStream | DataOutputStream | 입출력 스트림으로부터 자바의 기본 타입으로 데이터를 읽어올 수 있게 함. |
ObjectInputStream | ObjectOutputStream | 데이터를 객체 단위로 읽거나, 읽어 들인 객체를 역직렬화시킴. |
SequenceInputStream | X | 두 개의 입력 스트림을 논리적으로 연결함. |
PushbackInputStream | X | 다른 입력 스트림에 버퍼를 이용하여 push back이나 unread와 같은 기능을 추가함. |
X | PrintStream | 다른 출력 스트림에 버퍼를 이용하여 다양한 데이터를 출력하기 위한 기능을 추가함. |
문자 기반 스트림
자바에서 스트림은 기본적으로 바이트 단위로 데이터를 전송한다.
하지만 자바에서 가장 작은 타입인 char 형이 2바이트이므로, 1바이트씩 전송되는 바이트 기반 스트림으로는 원활한 처리가 힘든 경우가 있다.
따라서 자바에서는 바이트 기반 스트림뿐만 아니라 문자 기반의 스트림도 별도로 제공한다.
이러한 문자 기반 스트림은 기존의 바이트 기반 스트림에서 InputStream을 Reader로, OutputStream을 Writer로 변경하면 사용할 수 있다.
입력 스트림 | 출력 스트림 | 입출력 대상 |
---|---|---|
FileReader | FileWriter | 파일 |
CharArrayReader | CharArrayWriter | 메모리 |
PipedReader | PipedWriter | 프로세스 |
StringReader | StringWriter | 문자열 |
문자 스트림의 구성도
△ 입력 문자 스트림은 Reader라는 단어가 붙어있다.
스트림의 활용
스트림의 종류는 정말 다양하기 때문에, 각각의 기능을 이해하고 알고있기가 어렵다. 하지만 스트림이라는 개념을 정확히 알면 각각의 필요한 기능을 개발자가 원할때 가져와서 사용할수 있다. 가장 중요한 점은 문자열인가, 바이트 형식인가에 따라서 각각의 스트림을 구성해야할때 차이점과 API가 다르기 때문에 각각의 방식의 차이를 이해하고 있어야 한다.
간단한 예를 들어본 파일 업로드 코드이다.
FileOutputStream을 1차로 BufferedOutputStream을 통해 해당 파일경로에 바이트파일을 구성하여 파일을 업로드 하는 것이다. 이 외에도 소켓통신에서도 소켓의 바이트 데이터를 문자열로 바꾸기 위한 BufferedReader와 PrintWriter가 사용됨을 알 수 있다.
Reference
'Java' 카테고리의 다른 글
자바 컬렉션 프레임워크(Collection framework) (0) | 2018.06.20 |
---|---|
자바 제네릭(generic) (0) | 2018.06.20 |
자바(JAVA) 공백 문자열 제거 (0) | 2018.06.12 |
java annotation 과 reflection을 사용한 xml mapping (0) | 2018.05.31 |
JAVA 콘솔에서 컴파일 방법 (0) | 2018.05.31 |