일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- SSH
- Web
- centos
- mysql
- LIST
- mariaDB
- 자바
- Analysis
- Linux
- data
- 인공지능
- ai
- Security
- git
- 함수
- Python
- interface
- Server
- error
- learning
- db
- Pattern
- javascript
- framework
- Deep
- java
- Spring
- Numpy
- DeepLearning
- Github
- Today
- Total
PostIT
[Java] Java Stream의 개념과 종류 본문
# [Java] Java Stream의 개념과 종류, 그리고 예제를 통한 차이점 이해하기
- 최근 수정일 : 2017.04.27
- IDE : Spring Tool Suite
- OS : OSX Sierra (10.12.3)
- Lang : JAVA 1.8
## 1. 배경과 목적
- FileUpload, Socket 통신 등 다방면에서 Stream API를 사용하게 된다. 하지만, 예제를 보면서 혹은 여러가지 검색을 통해서 구현한다지만 정착 중요한 Stream들 간의 차이를 이해하지 못한다는 생각이 들었다. 이번 학습을 통해 Stream의 종류를 이해하고 차이를 분석하고자 한다.
## 2. 내용
### 1) Stream이란?
Stream은 '데이터 입출력 처리의 중간자 역할'을 수행합니다. 그래서, Stream은 입력과 출력이 관련된 곳이면 어디서든 동작합니다.
스트림은 쉽게 아래와 그림으로 이해할 수 있습니다.
위 그림처럼 스트림은 외부에서 들어오는 데이터를 입력받고(input) 출력(out)하는 '터널'과 같은 중간자 역할을 수행합니다.
중요한 점은 '단방향'으로 데이터를 송수신 하기 때문에 Input과 Output을 구분하여 사용합니다.
### 2) Stream의 종류
먼저, Stream은 크게 문자 단위 Stream과 Byte 단위의 Stream으로 나뉠 수 있습니다.
- 문자 스트림의 구성도
△ 입력 문자 스트림은 Reader라는 단어가 붙어있습니다.
클래스 | 설 명 | Stream |
Reader | 바이트 입력 스트림을 위한 추상 클래스 | 2차 Stream |
BufferedReader | 문자 버퍼 입력, 라인 해석 | 2차 Stream |
LineNumberReader | 문자 입력시 라인 번호를 유지 | 2차 Stream |
CharArrayReader | 문자 배열에서 읽어들임 | 1차 Stream |
InputStreamReader | 바이트 스트림을 문자 스트림으로 변환 | 2차 Stream |
FileReader | 파일에서 바이트를 읽어들여 문자 스트림으로 변환 | 1차 Stream |
FilterReader | 필터 적용(filtered) 문자 입력을 위한 추상 클래스 | 2차 Stream |
PushbackReader | 읽어들인 문자를 되돌림 (pushback) | 2차 Stream |
PipedReader | PipedWriter에서 읽어들임 | 1차 Stream |
StringReader | 문자열에서 읽어들임 | 1차 Stream |
△ 출력 문자 스트림은 Writer라는 단어가 붙어있습니다.
클래스 | 설 명 | Stream |
Writer | 문자 출력 스트림을 위한 추상 클래스 | 2차 Stream |
BufferedWriter | 문자 스트림에 버퍼 출력, 줄바꿈 사용 | 2차 Stream |
CharArrayWriter | 문자 스트림에 문자배열 출력 | 1차 Stream |
OutputStreamWriter | 문자 스트림을 바이트 스트림으로 변환 | 2차 Stream |
FileWriter | 문자 스트림을 바이트 파일로 변환 | 1차 Stream |
FilterWriter | 필터 적용(filtered) 문자 출력을 위한 추상 클래스 | 2차 Stream |
PipedWriter | PipedReader에 출력 | 1차 Stream |
StringWriter | 문자열 출력 | 1차 Stream |
PrintWriter | Writer 값과 객체를 프린트 | 2차 Stream |
- 바이트 스트림의 구성도
△ 입력 바이트 스트림은 InputStream라는 단어가 붙어있습니다.
클래스 | 설 명 | Stream |
InputStream | 바이트 입력 스트림을 위한 추상 클래스 | 2차 Stream |
FileInputStream | 파일에서 바이트를 읽어들여 바이트 스트림으로 변환 | 1차 Stream |
PipedInputStream | PipedOutputStream에서 읽어들임 | 1차 Stream |
FilterInputStream | 필터 적용(filtered) 바이트 입력을 위한 추상 클래스 | 2차 Stream |
LineNumberInputStream | 바이트 입력시 라인 번호를 유지 (비추천) | 2차 Stream |
DataInputStream | 기본 자료형 데이터를 바이트로 입력 | 2차 Stream |
BufferedInputStream | 바이트 버퍼 입력 | 2차 Stream |
PushbackInputStream | 읽어들인 바이트를 되돌림 (pushback) | 2차 Stream |
ByteArrayInputStream | 바이트 배열에서 읽어들임 | 1차 Stream |
SequenceInputStream | t서로 다른 InputStream을 입력받은 순서대로 이어줌 | 2차 Stream |
StringBufferInputStream | 문자열에서 읽어들임 (비추천) | 1차 Stream |
ObjectInputStream | 객체로 직렬화된 데이터를 역직렬화 하여 읽는다. | 2차 Stream |
△ 출력 바이트 스트림은 OutputStream라는 단어가 붙어있습니다. (아닌 것도 있지만 대부분 이 형식에 따름)
클래스 | 설 명 | Stream |
OutputStream | 바이트 출력 스트림을 위한 추상 클래스 | 2차 Stream |
FileOutputStream | 바이트 스트림을 바이트 파일로 변환 | 1차 Stream |
PipedOutputStream | PipedOutputStream에 출력 | 1차 Stream |
FilterOutputStream | 필터 적용(filiterd) 바이트 출력을 위한 추상 클래스 | 2차 Stream |
DataOutputStream | 바이트를 기본자료형으로 출력 | 2차 Stream |
BufferedOutputStream | 바이트 스트림에 버퍼 출력 | 2차 Stream |
PrintStream | Stream 값과 객체를 프린트 | 2차 Stream |
ByteArrayOutputStream | 바이트 스트림에 바이트 배열 출력 | 1차 Stream |
ObjectputStream | 데이터를 객체로 직렬화 하여 출력 | 2차 Stream |
## 3. 결론
- 먼저, 위의 다양한 스트림의 종류를 외우지 않더라도, 각각의 기능을 이해하고 알고있으면 필요할 때 원하는 스트림을 쓸 수 있을 것으로 판단합니다. 그리고, 가장 중요한 것은, 문자열이냐 바이트 형식이냐에 따라 각각의 API의 용도와 방식의 차이를 알아야 하는 것이 중요하다고 생각합니다.
- 간단한 예로 파일 업로드를 보겠습니다.
BufferedOutputStream stream = new BufferedOutputStream(new FileOutputStream(serverFile));
byte[] bytes = fileDataList.get(j).getFileByte();
stream.write(bytes);
stream.close();
FileOutputStream을 1차로 BufferedOutputStream을 통해 해당 파일경로에 바이트파일을 구성하여 파일을 업로드 하는 것입니다. 이 외에도 소켓통신에서도 소켓의 바이트 데이터를 문자열로 바꾸기 위한 BufferedReader와 PrintWriter가 사용됨을 알 수 있습니다.
BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
PrintWriter printWriter = new PrintWriter(socket.getOutputStream(), true);
위처럼, 많은 상황에서 우리는 Stream을 자연스럽게 사용하고 있습니다.. Stream의 이해와 공부가 개인적으로 더 필요할 것으로 생각되지만, 현재는 이 부분에서 정리를 마치고자 합니다. 각각의 스트림을 통해 잘 이용하도록 공부한 후 더 필요한 정보를 올리겠습니다.
## 4. 참조
- http://hyeonstorage.tistory.com/250
'Java' 카테고리의 다른 글
[Java/JVM] JVM 이해를 통한 Java 작동원리 이해하기 (0) | 2017.06.01 |
---|---|
[Java/Stack/Heap] JAVA의 Stack과 Heap의 이해를 통해 Java의 메모리 관리 (1) | 2017.05.31 |
[Java] Interface와 Abstract class의 차이점 및 사용방법 이해하기. (1) | 2017.04.18 |
[Java/Exception]Java Exception이란? 그리고 RuntimeException (0) | 2017.03.12 |
[Java]초보자를 위한 예외 처리 이야기 - 퍼옴 (0) | 2016.11.28 |