SHUSTORY

15-1 자바 입출력과 스트림 본문

프로그래밍/JAVA

15-1 자바 입출력과 스트림

어서오시우 2023. 3. 21. 10:11
728x90

스트림

입출력은 외부 저장 장치나 네트워크와 연동해야 하기 때문에 장치에 따라 다르게 구현해야 한다.

자바는 장치에 따라 독립적이고 효율적인 입출력 기능을 제공한다.

 

자바에서 모든 입출력은 스트림을 통해 이루어진다.

입출력 장치는 매우 다양하기 때문에 장치에 따라 입출력 부분을 일일이 다르게 구현하면 프로그램 호환성이 떨어진다.

이런 문제 해결을 위해 자바는 입출력 장치와 무관하고 일관성 있게 프로그램을 구현할 수 있도록 일종의 가상 통로인 스트림을 제공한다. 자료를 읽어 들이려는 소스와 자료를 쓰려는 대상에 따라 각각 다른 스트림 클래스를 제공한다.

자바에서 입출력 기능을 사용하는 곳은 파일 디스크, 키보드, 모니터, 메모리 입출력, 네트워크 등이 있다.

 

 

입력 스트림과 출력 스트림

어떤 대상으로부터 자료를 읽어 들일 때 사용하는 입력이 입력 스트림이다.

예를 들어 어떤 동영상을 재생하기 위해 동영상 파일에서 자료를 읽을 때 입력 스트림이 사용된다.

 

편집 화면에서 사용자가 쓴 글을 파일에 저장할 때는 출력 스트림을 사용한다.

 

스트림은 단방향으로 자료가 이동하기 때문에 입력과 출력을 동시에 할 수 없다.

따라서 어떤 스트림이 있다고 하면 그 스트림은 입력 스트림이거나 출력 스트림이다.

스트림의 이름을 보면 입력용인지 출력용인지 파악할 수 있다.

InputStream이나 Reader로 끝나는 이름의 클래스는 입력 스트림이다.

반면 OutputStream이나 Writer로 끝나는 이름의 클래스는 출력 스트림이다.

종류 예시
입력 스트림 FileInputStream, FileReader, BufferedInputStream, BufferedReader 등
출력 스트림 FileOutputStream, FileWriter, BufferedOutputStream, BufferedWriter 등

 

 

바이트 단위 스트림과 문자 단위 스트림

원래 자바의 스트림은 바이트 단위로 자료의 입출력이 이루어진다.

그러므로 그림, 동영상, 음악 파일 등 대부분 파일은 바이트 단위로 읽거나 쓰면 된다.

그런데 자바에서 하나의 문자를 나타내는 char형은 2바이트이기 때문에 1바이트만 읽으면 한글 같은 문자는 깨진다.

따라서 입출력 중 가장 많이 사용하는 자료인 문자를 위해 문자 스트림을 별도로 제공한다.

즉 읽어 들이는 자료형에 따라 바이트용문자용 스트림이 있다.

 

스트림 클래스의 이름이 Stream으로 끝나는 경우는 바이트 단위를 처리하는 스트림이다.

Reader나 Writer로 끝나는 이름은 문자를 위한 스트림 클래스이다.

종류 예시
바이트 스트림 FileInputStream, FileOutputStream, BufferdInputStream, BufferedOutputStream
문자 스트림 FileReader, FileWriter, BufferedReader, BufferedWriter

 

 

기반 스트림과 보조 스트림

어떤 스트림이 자료를 직접 읽거나 쓰는 기능을 제공하는 스트림인가,

혹은 자료를 직접 읽거나 쓰는 기능은 없이 다른 스트림에 부가 기능을 제공하는가에 따라

기반 스트림보조 스트림으로 구분할 수 있다.

 

기반 스트림은 읽어 들일 곳( 소스 )이나 써야 할 곳( 대상 )에서 직접 읽고 쓸 수 있으며 입출력 대상에 직접 연결되어 생성되는 스트림이다.

반면 보조 스트림은 직접 읽고 쓰는 기능이 없기 때문에 항상 다른 스트림을 포함하여 생성된다.

 

기반 스트림과 보조 스트림은 이름만으로 구별하기는 어려울 수도 있다.

종류 예시
기반 스트림 FileInputStream, FileOutputStream, FileReader, FileWriter
보조 스트림 InputStreamReader, OutputStreamReader, BufferedInputStream, BufferedOutputStream

 

이렇듯 하나의 스트림 클래스는 세 가지 분류로 나눌 수 있다.

예를 들어 FileInputStream을 살펴보면 InputStream이니 입력 스트림이고,

Stream이니 바이트 단위로 처리하며, File에 직접 읽고 쓰는 기반 스트림이다.

'프로그래밍 > JAVA' 카테고리의 다른 글

15-3 바이트 단위 스트림  (0) 2023.03.21
15-2 표준 입출력  (0) 2023.03.21
14-4 사용자 정의 예외  (0) 2023.03.17
14-3 예외 처리 미루기  (0) 2023.03.17
14-2 예외 처리하기  (0) 2023.03.16