16-1. 자바 입출력과 스트림
입출력 스트림
- 네트워크에서 자료의 흐름이 물의 흐름과 같다는 비유에서 유래됨
- 자바는 다양한 입출력 장치에 독립적으로 일관성 있는 입출력을 입출력 스트림을 통해 제공
- 입출력이 구현되는 곳 : 파일 디스크, 키보드, 마우스, 네트웍, 메모리 등 모든 자료가 입력되고 출력되는 곳
입출력 스트림의 구분
- 대상 기준 : 입력 스트림 /출력 스트림
- 자료의 종류 : 바이트 스트림 / 문자 스트림
- 기능 : 기반 스트림 / 보조 스트림
입력 스트림과 출력 스트림
- 입력 스트림 : 대상으로부터 자료를 읽어 들이는 스트림
- 출력 스트림 : 대상으로 자료를 출력하는 스트림
종류 | 예시 |
입력 스트림 | FileInputStream, FileReader, BufferedInputStream, BufferedReader 등 |
출력 스트림 | FileOutputStream, FileWriter, BufferedOutputStream, BufferedWriter 등 |
바이트 단위 스트림과 문자 단위 스트림
- 바이트 단위 스트림 : 동영상, 음악 파일, 실행 파일 등의 자료를 읽고 쓸 때 사용
- 문자 단위 스트림 : 바이트 단위로 자룔를 처리하면 문자는 깨짐. 인코딩에 맞게 2바이트 이상으로 처리하도록 구현된 스트림
종류 | 예시 |
바이트 스트림 | FileputStream, FileOutputStream, BufferedInputStream, BufferedOutputStream 등 |
문자 스트림 | FileReader, FileWriter, BufferedReader, BufferedWriter 등 |
기반 스트림과 보조 스트림
- 기반 스트림 : 대상에 직접 자료를 읽고 쓰는 기능의 스트림
- 보조 스트림 : 직접 읽고 쓰는 기능은 없이 추가적인 기능을 더해주는 스트림
- 보조 스트림은 직접 읽고 쓰는 기능은 없으므로 항상 기반 스트림이나 또 다른 보조 스트림을 생성자의 매개변수로 포함함
종류 | 예시 |
기반 스트림 | FileInputStream, FileOutputStream, FileReader, FileWriter 등 |
보조 스트림 | InputStreamReader, OutputStreamWriter, BufferedInputStream, BufferedOutputStream 등 |
16-2. 표준 입출력
System 클래스의 표준 입출력 멤버
public class System { public static PrintStream out; public static InputStream in; public static PrintStream err; } |
- System.out
- 표준 출력(모니터) 스트림
- System.out.println("출력 메세지");
- System.in
- 표준 입력(키보드) 스트림
- int d = System.in.read() // 한 바이트 읽기
- System.err
- 표준 에러 출력(모니터) 스트림
- System.err.println("에러 메세지");
System.in 으로 화면에서 문자 입력받기
package stream.inputstream;
import java.io.IOException; public class SystemInTest1 { public static void main(String[] args) throws IOException { System.out.println("알파벳 하나를 쓰고 [Enter]를 누르세요"); int i; try { i = System.in.read(); // read()메서드로 한 바이트 읽음 System.out.println(i); System.out.println((char)i); // 문자로 변환하여 출력 } catch (IOException e) { e.printStackTrace(); } } } |
출력
알파벳 하나를 쓰고 [Enter]를 누르세요
A 65 A |
문자 여러 개를 입력받기
package stream.inputstream;
import java.io.IOException; public class SystemInTest1 { public static void main(String[] args) throws IOException { System.out.println("알파벳 여러 개를 쓰고 [Enter]를 누르세요"); int i; try { while((i = System.in.read()) != '\n') { // [Enter]에 해당하는 '\n' 값이 입력될 때까지 한 바이트를 반복해 읽음 System.out.println((char)i); } } catch (IOException e) { e.printStackTrace(); } } } |
출력
알파벳 여러 개를 쓰고 [Enter]를 누르세요
hello hello |
16-3. 바이트 단위 입출력 스트림
InputStream
- 바이트 단위 입력 스트림 최상위 추상 클래스
- 많은 추상 메서드가 선언되어 있고 이를 하위 스트림이 상속받아 구현함
- 주요 하위 클래스
스트림 클래스 | 설명 |
FileInputStream | 파일에서 바이트 단위로 자료를 읽습니다. |
ByteArrayInputStream | byte 배열 메모리에서 바이트 단위로 자료를 읽습니다. |
FilterInputStream | 기반 스트림에서 자료를 읽을 때 추가 기능을 제공하는 보조 스트림의 상위 클래스 |
- 주요 메서드
메서드 | 설명 |
int read() | 입력 스트림으로부터 한 바이트의 자료를 읽습니다. 읽은 자료의 바이트 수를 반환합니다. |
int read(byte b[]) | 입력 스트림으로부터 b[] 크기의 자료를 b[]에 읽습니다. 읽은 자료의 바이트 수를 반환합니다. |
int read(byte b[]m int off, int len) | 입력 스트림으로부터 b[] 크기의 자료를 b[]의 off변수 위치부터 저장하며 len만큼 읽습니다. 읽은 자료의 바이트 수를 반환합니다. |
void close() | 입력 스트림과 연결된 대상 리소스를 닫습니다. |
OutputStream
- 바이트 단위 출력 스트림 최상위 추상 클래스
- 많은 추상 메서드가 선언되어 있고 이를 하위 스트림이 상속받아 구현함
- 주요 하위 클래스
스트림 클래스 | 설명 |
FileOutputStream | 파일에서 바이트 단위로 자료를 씁니다. |
ByteArrayOutputStream | byte 배열 메모리에서 바이트 단위로 자료를 씁니다. |
FilterOutputStream | 기반 스트림에서 자료를 쓸 때 추가 기능을 제공하는 보조 스트림의 상위 클래스 |
- 주요 메서드
메서드 | 설명 |
int write() | 한 바이트를 출력합니다. |
int write(byte b[]) | b[] 크기의 자료를 출력합니다. |
int write(byte b[], int off, int len) | b[] 배열에 있는 자료의 off 위치부터 len 개수만큼 자료 출력합니다. |
void flush() | 출력을 위해 잠시 자료가 머무르는 출력 버퍼를 강제로 비워 자료를 출력합니다. |
void close() | 출력 스트림과 연결된 대상 리소스를 닫습니다. 출력 버퍼가 비웝니다. |
16-4. 문자 단위 입출력 스트림
Reader
- 문자 단위 입력 스트림 최상위 추상 클래스
- 많은 추상 메서드가 선언되고 있고 이를 하위 스트림이 상속받아 구현함
- 주요 하위 클래스
클래스 | 설명 |
FileReader | 파일에서 문자 단위로 읽는 스트림 클래스 입니다. |
InputStreamReader | 바이트 단위로 읽은 자료를 문자로 변환해주는 보조 스트림 클래스 입니다. |
BufferedReader | 문자로 읽을 때 배열을 제공하여 한꺼번에 읽을 수 있는 기능을 제공하는 보조 스트림 입니다. |
- 주요 메서드
메서드 | 설명 |
int read() | 파일로부터 한 문자를 읽습니다. 읽은 문자를 반환합니다. |
int read(char[] buf) | 파일로부터 buf 배열에 문자를 읽습니다. |
int read(char[] buf, int off, int len) | 파일로부터 buf 배열의 위치로부터 len 개수만큼의 문자를 읽습니다. |
void close() | 입력 스트림과 연결된 대상 리소스를 닫습니다. |
Writer
- 문자 단위 출력 스트림 최상위 추상 클래스
- 많은 추상 메서드가 선언되어 있고 이를 하위 스트림이 상속받아 구현함
- 주요 하위 클래스
클래스 | 설명 |
FileWriter | 파일에서 문자 단위로 출력하는 스트림 클래스 입니다. |
OutputStreamWriter | 바이트 단위의 자료를 문자로 변환해 출력해주는 보조 스트림 클래스 입니다. |
BufferedWriter | 문자로 쓸 때 배열을 제공하여 쓸 수 있는 기능을 제공하는 보조 스트림 클래스 입니다. |
- 주요 메서드
메서드 | 설명 |
int write(int c) | 한 문자를 파일에 합니다. |
int write(char[] buf) | 문자 배열 buf의 내용을 출력합니다. |
int write(char[] buf, int off, int len) | 문자 배열 buf의 off 위치에서부터 len 개수의 문자를 출력합니다. |
int write(String str) | 문자열 str을 출력합니다. |
int write(String str, int off, int len) | 문자열 str의 off번째 문자로부터 len 개수만큼 출력합니다. |
int flush() | 출력하기 전에 자료가 있는 공간(출력 버퍼)을 비워 출력하도록 합니다. |
void close() | 스트림과 연결된 리소스를 닫습니다. 출력 버퍼도 지워집니다. |
16-5. 보조 스트림
- 실제 읽고 쓰는 스트림이 아닌 보조 기능을 제공하는 스트림
- FilterInputStream과 FilterOutputStream이 보조 스트림의 상위 클래스들
- 생성자의 매개변수로 또 다른 스트림(기반 스트림이나 다른 보조 스트림)을 가짐
- Decorator Pattern으로 구현 됨
- 상위 클래스 생성자
생성자 | |
protected FilterInputStream과 (InputStream in) | 생성자의 매개변수로 InputStream을 받습니다. |
public FilterOutputStream(OutputStream out) | 생성자의 매개변수로 OutputStream을 받습니다. |
InputStreamReader와 OutputStreamWriter
- 바이트 단위로 읽거나 쓰는 자료를 문자로 변환해주는 보조 스트림
BufferedInputStream과 BufferedOutputStream
- 약 8k의 배열이 제공되어 입출력을 빠르게 하는 기능이 제공되는 보조 스트림
- BufferedReader와 BufferedWriter는 문자용 입출력 보조 스트림
16-6. 직렬화 (serialization)
serialization 이란?
- 인스턴스의 상태를 그대로 파일 저장하거나 네트웍으로 전송하고 (serializtion) 이를 다시 복원(deserialization) 하는 방식
- 자바에서는 보조 스트림을 활용하여 직렬화를 제공함
- ObjectInputStream과 ObjectOutputStream
생성자 | 설명 |
ObjectInputStream(InputStream in) | InputStream을 생성자의 매개변수로 받아 ObjectInputStream을 생성합니다. |
ObjectOutputStream(OutputStream out) | OutputStream을 생성자의 매개변수로 받아 ObjectOutputStream을 생성합니다. |
Serializable 인터페이스
- 직렬화는 인스턴스의 내용이 외부로 유출되는 것이므로 프로그래머가 해당 객체에 대한 직렬화 의도를 표시해야 함
- 구현 코드가 없는 marker interface
- transient : 직렬화 하지 않으려는 멤버 변수에 사용함 (Socket 등 직렬화 할 수 없는 객체)
16-7. 그 외 입출력 클래스
File 클래스
- 파일 개념을 추상화한 클래스
- 입출력 기능은 없고, 파일의 이름, 경로, 읽기 전용 등의 속성을 알 수 있음
- 이를 지원하는 여러 메서드들이 제공됨
RandomAccessFile 클래스
- 입출력 클래스 중 유일하게 파일에 대한 입력과 출력을 동시에 할 수 있는 클래스
- 파일 포인터가 있어서 읽고 쓰는 위치의 이동이 가능함
- 다양한 메서드가 제공됨
16-8. 데코레이터 패턴 (Decorator Pattern)
- 자바의 입출력 스트림은 decorator pattern 임
- 여러 decorator들을 활용하여 다양한 기능을 제공
- 상속보다 유연한 구현 방식
- 데코레이터는 다른 데코레이터나 또는 컴포넌트를 포함해야 함
- 지속적인 기능의 추가와 제거가 용이함
- decorator와 component는 동일한 것이 아님 (기반 스트림 클래스가 직접 읽고 쓸 수 있음, 보조 스트림은 추가적인 기능 제공)
'Programming Language > JAVA' 카테고리의 다른 글
자바 스트림 API (java stream API) (0) | 2023.09.07 |
---|---|
람다표현식과 표준 API 함수적 인터페이스 (0) | 2023.09.06 |
[Do it 자바 프로그래밍 입문] 15. 예외 처리 (0) | 2023.06.15 |
[Do it 자바 프로그래밍 입문] 14. 내부 클래스, 람다식, 스트림 (1) | 2023.06.15 |
[Do it 자바 프로그래밍 입문] 13. 컬렉션 프레임워크 (0) | 2023.06.14 |