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]를 누르세요

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는 동일한 것이 아님 (기반 스트림 클래스가 직접 읽고 쓸 수 있음, 보조 스트림은 추가적인 기능 제공)
xoo | 수진