스트림이란?

  • 네트워크에서 자료의 흐름이 물과 같다는 의미에서 유래
  • 다양한 입출력 장치에 독립적으로 일관성 있는 입출력을 제공하는 방식
  • 입출력이 구현되는 곳 : 파일디스크, 키보드, 마우스, 메모리, 네트워크 등
  • 예외처리 필요


스트림의 구분

대상 기준

  • 입력 스트림 / 출력 스트림

자료의 종류

  • 바이트 스트림 / 문자 스트림

기능

  • 기반 스트림 / 보조 스트림

입력 스트림과 출력 스트림

  • 입력 스트림 : 대상으로 부터 자료를 읽어들이는스트림
  • 출력 스트림 : 대상으로 자료를 출력하는 스트림
  • 입, 출력 스트림을 동시에 하지 않는다.
  • 스트림의 종류
종류 예시
입력 스트림 FileInputStream, FileReader, BufferedInputStream, BufferedReader 등
출력 스트림 FileOutputStream, FileWriter, BufferedOutputStream, BufferedWriter 등

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

  • 바이트 단위 스트림 : 동영상, 음악 파일 등을 읽고 쓸 때 사용
  • 문자 단위 스트림 : 바이트 단위로 자료를 처리하면 문자는 깨짐 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


Scanner 클래스

  • 많이 씀
  • java.util 패키지에 있는 입력  클래스
  • 문자 뿐 아니라 정수, 실수 등 다른 자료형도 읽을 수 있음
  • 여러 대상에서 자료를 읽을 수 있음 ( 콘솔, 파일 등 )
  • 생성자
생성자 설명
Scanner(File source) 파일을 매개변수로 받아 Scanner을 생성
Scanner(InputStream source) 바이트 스트림을 매개변수로 받아 Scanner를 생성
Scanner(String source) String을 매개변수로 받아 Scanner를 생성
  • 메서드


Console 클래스

  • System.in을 사용하지 않고 콘솔에서 표준 입력을 할 수 있음
  • 이클립스와 연동되지 않음
  • command 창에서 입력
  • 메서드


바이트 단위 스트림 - InputStream

  • 바이트 단위 입력용 최상위 스트림
  • 추상 메서드를 포함한 추상 클래스로 하위 클래스가 구현하여 사용
  • 주요 하위 클래스
스트림 클래스 설명
FileInputStream 파일에서 바이트 단위로 자료를 읽는다.
ByteArrayInputStream Byte 배열 메모리에서 바이트 단위로 자료를 읽는다.
FilterInputStream 기반 스트림에서 자료를 읽을 때 추가 기능을 제공하는 보조 스트림의 상위 클래스
  • 메서드


바이트 단위 스트림 - OutputStream

  • 바이트 단위 출력용 최상위 스트림
  • 추상 메서드를 포함한 추상 클래스로 하위 클래스가 구현하여 사용
  • 주요 하위클래스
스트림 클래스 설명
FileOutputStream 바이트 단위로 파일에 자료를 쓴다
ByteArrayOutputStream Byte 배열에 바이트 단위로 자료를 쓴다
FilterOutputStream 기반 스트림에서 자료를 쓸 때 추가 기능을 제공하는 보조 스트림의 상위 클래스
  • 메서드

flush()와 close() 메서드

  • 출력 버퍼를 비울 때 flush() 메서드 사용
  • close() 매서드 내부에서 flush()가 호출되므로 close() 메소드가 호출되면 출력 버퍼가 비워짐

문자 단위 스트림 - Reader

  • 문자 단위로 읽는 최상위 스트림
  • 하위 클래스에서 상속 받아 구현
스트림 클래스 설명
FileReader 파일에서 문자 단위로 읽는 스트림 클래스
InputStreamReader 바이트 단위로 읽은 자료를 문자로 변환해 주는 보조 스트림 클래스
BufferedReader 문자로 읽을 때 배열을 제공하여 한꺼번에 읽을 수 있는 기능을 제공해주는 보조스트림
  • 주요 메서드


보조 스트림

  • 실제 읽고 쓰는 스트림이 아닌 보조적인 기능을 추가하는 스트림
  • 데코레이터 패턴
  • FilterInputStream과 FilterOutputStream이 보조 스트림의 상위 클래스
  • 생성자의 매개 변수로 또 다른 스트림을 가짐
생성자 설명
protected FilterInputStream(InpuStream in) 생성자의 매개변수로 InputStream을 받는다
public FilterOutputStream(OutputStream out) 생성자의 매개변수로 OutputStream을 받는다.


InputStreamReader와 OutputStreamWriter

  • 바이트 단위로 읽거나 쓰는 자료를 문자로 변환해주는 보조 스트림

 

1. FileInputStream(바이트 스트림)으로 읽은 자료를 문자로 변환하는 예

  • FileInputStream 을 통해 파일을 읽어오는 문자가 다 깨져서 나오게 된다.

  • InputStreamReader 에 FileinputStream을 감싸서 생성 -> 정상

 

2. FileInputStream(바이트 스트림)으로 읽은 파일을 FileOutputStream(바이트 스트림)으로 쓰는 예

  • 매우 느림

Buffered 스트림

  • 내부적으로 8192 바이트 배열을 가지고 읽거나 쓰기 기능을 재공하여 속도가 빨라짐

  • 버퍼 사용 결과 ( 빨라짐 ! )

3. 소켓 프로그래밍의 예

public class SocketTest {
    public static void main(String[] args) {
        Socket socket = new Socket();
        try {
            BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            //보조스트림(보조스트림(기반스트림))
            br.readLine();
        } catch (IOException e) {
            System.out.println(e);
        }
    }
}

4. 자료형에 기반하여 파일을 쓰고 읽는 예

  • DataInputStream, DataOutputStream 보조스트림 사용
  • 파일 내에서는 깨져서 보이지만 읽어들일 때 형에 맞춰서 정상적으로 가져옴


DataInputStream과 DataOutputStream

  • 자료가 메모리에 저장된 0,1 상태 그대로 읽거나 쓰는 스트림

직렬화 (Serialization)

  • 인스턴스의 상태를 그대로 저장하거나 (serialization) 다시 복원하는 (deserialization) 방식
  • 파일에 쓰거나 네트워크로 전송
  • ObjectInputStream과 ObjectOutputStream 사용

  • 직렬화할 대상 클래스에 implements Serializable 을 해주어야 한다.
  • 직렬화 대상에서 빼려면 앞에 transient를 선언한다. (ex. transient String title;)


Serializable 인터페이스

  • 직렬화는 인스턴스 내용이 외부로 유출되는 것이므로 프로그래머가 직렬화 의도를 표시해야 함
class Person implements Serializable {
  ...
  String name;
  String title;
  ...
}

Externalizable 인터페이스

  • 프로그래머가 자료를 읽고 쓰는 방식을 직접 구현 함


그 외 입출력 클래스

File 클래스

  • 파일개념을 추상화한 클래스
  • 입출력 기능은 없고 파일의 속성, 경로, 이름 등을 알 수 있음

RandomAccessFile 클래스

  • 입출력 클래스 중 유일하게 파일 입출력을 동시에 할 수 있는 클래스
  • 파일 포인터가 있어서 읽고 쓰는 위치의 이동이 가능
  • 다양한 자료형에 대한 메서드가 제공됨

+ Recent posts