스트림
Updated:
강의 사이트
http://tcpschool.com/
스트림
1. 스트림
- 자바에서는 파일이나 콘솔의 입출력을 직접 다루지 않고, 스트림(stream)이라는 흐름을 통해 다룬다.
- 스트림이란 실제의 입력이나 출력이 표현된 데이터의 이상화된 흐름을 의미
-
즉, 스트림은 운영체제에 의해 생성되는 가상의 연결 고리를 의미하며, 중간 매개자 역할
- 자바 SE 8에 추가된 스트림 API와 다른 개념
2. 입출력 스트림
- 스트림은 한 방향으로만 통신할 수 있으므로, 입력과 출력을 동시에 처리할 수는 없다.
- 따라서 입력 스트림, 출력 스트림으로 구분
- 자바에서는 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 바이트를 출력 스트림에 저장함. |
3. 바이트 기반 스트림
- 자바에서 스트림은 기본적으로 바이트 단위로 데이터를 전송
입력 스트림 | 출력 스트림 | 입출력 대상 |
---|---|---|
FileInputStream | FileOutputStream | 파일 |
ByteArrayInputStream | ByteArrayOutputStream | 메모리 |
PipedInputStream | PipedOutputStream | 프로세스 |
AudioInputStream | AudioOutputStream | 오디오 장치 |
4. 보조 스트림
- 자바에서 제공하는 보조 스트림은 실제로 데이터를 주고받을 수는 없지만, 다른 스트림의 기능을 향상시키거나 새로운 기능을 추가해 주는 스트림
입력 스트림 | 출력 스트림 | 설명 |
---|---|---|
FilterInputStream | FilterOutputStream | 필터를 이용한 입출력 |
BufferedInputStream | BufferedOutputStream | 버퍼를 이용한 입출력 |
DataInputStream | DataOutputStream | 입출력 스트림으로부터 자바의 기본 타입으로 데이터를 읽어올 수 있게 함. |
ObjectInputStream | ObjectOutputStream | 데이터를 객체 단위로 읽거나, 읽어 들인 객체를 역직렬화시킴. |
SequenceInputStream | X | 두 개의 입력 스트림을 논리적으로 연결함. |
PushbackInputStream | X | 다른 입력 스트림에 버퍼를 이용하여 push back이나 unread와 같은 기능을 추가함. |
X | PrintStream | 다른 출력 스트림에 버퍼를 이용하여 다양한 데이터를 출력하기 위한 기능을 추가함. |
5. 문자 기반 스트림
- 자바에서 스트림은 기본적으로 바이트 단위로 데이터를 전송
- 하지만 자바에서 가장 작은 타입인 char 형이 2바이트이므로, 1바이트씩 전송되는 바이트 기반 스트림으로는 원활한 처리가 힘든 경우가 있다.
- 따라서 자바에서는 바이트 기반 스트림뿐만 아니라 문자 기반의 스트림도 별도로 제공
- 이러한 문자 기반 스트림은 기존의 바이트 기반 스트림에서 InputStream을 Reader로, OutputStream을 Writer로 변경하면 사용할 수 있다.
입력 스트림 | 출력 스트림 | 입출력 대상 |
---|---|---|
FileReader | FileWriter | 파일 |
CharArrayReader | CharArrayWriter | 메모리 |
PipedReader | PipedWriter | 프로세스 |
StringReader | StringWriter | 문자열 |
- 문자 기반 보조 스트림
입력 스트림 | 출력 스트림 | 설명 |
---|---|---|
FilterReader | FilterWriter | 필터를 이용한 입출력 |
BufferedReader | BufferedWriter | 버퍼를 이용한 입출력 |
PushbackReader | X | 다른 입력 스트림에 버퍼를 이용하여 push back이나 unread와 같은 기능을 추가함. |
X | PrintWriter | 다른 출력 스트림에 버퍼를 이용하여 다양한 데이터를 출력하기 위한 기능을 추가함. |
파일 입출력
1. 표준 입출력
- 자바에서는 콘솔과 같은 표준 입출력 장치를 위해 System이라는 표준 입출력 클래스를 정의
클래스 변수 | 입출력 스트림 | 설명 |
---|---|---|
System.in | InputStream | 콘솔로부터 데이터를 입력받음. |
System.out | PrintStream | 콘솔로 데이터를 출력함. |
System.err | PrintStream | 콘솔로 데이터를 출력함. |
2. File 클래스
- 자바는 이러한 입출력 작업 이외의 파일과 디렉터리에 관한 작업을 File 클래스를 통해 처리
메소드 | 설명 |
---|---|
boolean canRead() | 해당 파일이 읽을 수 있는 파일인지를 검사함. |
boolean canWrite() | 해당 파일이 쓸 수 있는 파일인지를 검사함. |
boolean delete() | 해당 파일 또는 디렉터리를 삭제함. |
boolean exists() | 해당 파일이 존재하는지를 검사함. |
String getPath() | 해당 파일의 경로명을 문자열로 반환함. |
boolean isAbsolute() | 해당 파일의 경로명이 절대 경로인지를 검사함. |
boolean isDirectory() | 해당 파일이 디렉터리인지를 검사함. |
boolean isFile() | 해당 파일이 파일인지를 검사함. |
long length() | 해당 파일의 크기를 반환함. |
boolean mkdir() | 지정된 경로에 디렉터리를 생성함. |
boolean mkdirs() | 지정된 경로에 디렉터리를 생성하며, 필요한 모든 상위 디렉터리도 생성함. |
boolean renameTo(File dest) | 해당 파일의 이름을 전달된 파일 이름으로 변경함. |
boolean setExecutable(boolean executable) boolean setReadable(boolean readable) boolean setWritable(boolean writable) boolean setReadOnly() |
해당 파일의 속성을 변경함. |