스트림

  • 순서가 있는 일련의 데이터 흐름을 의미
  • 데이터 생산자(소스)와 데이터 소비자(목적지) 사이의 데이터가 지나가는 통로
  • Java 언어에서 스트림을 통해 입출력을 수행할 수 있음
    • 입력 스트림은 데이터 생산자(소스)와 연결
    • 출력 스트림은 데이터 소비자(목적지)와 연결
  • 다양한 입출력 종류(디스크, 문자 배열, 네트워크 소켓, 다른 프로그램 등)에 상관없이 동일한 방법으로 프로그램을 작성
    • 스트림을 통해 입출력을 제어함

스트림의 분류

  1. 입력스트림과 출력스트림
    • 프로그램은 입력 스트림으로부터 데이터를 읽을 수 있음
      • 데이터 소스가 설정되어야 함
    • 프로그램은 출력스트림으로 데이터를 쓸 수 있음
      • 데이터 목적지가 설정되어야 함

  2. 바이트 스트림과 캐릭터 스트림
    • 바이트 스트림은 byte 단위로 데이터를 다룸
      • (…)InputStream / (…)OutputStream
    • 캐릭터 스트림은 char 단위로 데이터를 다룸
      • (…)Reader / xxxWriter

  3. 기본 스트림과 보조 스트림
    • 기본 스트림은 입출력 기능을 제공하는 스트림
    • 보조 스트림은 자체적으로 입출력 기능을 수행할 수는 없어서 기본 스트림과 함께 사용되어야 하며, 보조 기능을 제공하는 스트림

스트림 관련 클래스

처리단위 처리방향 입력 스트림 출력 스트림
기본 스트림 바이트 스트림 InputStream
FileInputStream
OutputStream
FileOutputStream
문자 스트림 Reader
FileReader
Writer
FileWriter
보조 스트림 바이트 스트림 BufferedInputStream

DataInputStream
ObjectInputStream
BufferedOutputStream
PrintStream
DataOutputStream
ObjectOutputStream
문자 스트림 BufferedReader
BufferedWrite
PrintWriter
기타 InputStramReader OutputStreamWriter

스트림 사용하기

  1. 어떤 스트림클래스를 사용할 것인가
    • 입력 / 출력 스트림 선택
    • 데이터 생산자와 소비자를 결정
      • 기본 스트림을 반드시 사용해야 함
    • 문자 단위 / 바이트 단위 선택
    • 보조 스트림이 필요한가
      • 필요하다면 기본 스트림 객체를 먼저 생성하고, 기본스트림을 감싸 보조 스트림 객체를 생성함
      • ex) FileInputStream fis = new FileInputStream(); 와 같이 기본 스트림을 생성해준 후 BufferedInputStream bis = new BufferedInputStream (fis); 와 같이 보조스트림에 인자로 기본 스트림을 넣어줌

바이트 스트림

  1. InputStream 클래스
    바이트 단위 입력 스트림 클래스의 최상위 클래스
    추상 클래스이며, 이것의 하위 클래스는 (…)InputStream

    • 주요 메소드
      1) abstract int read()
      - 입력 스트림으로부터 1바이트를 읽어 정수로 리턴함
      2) int read(byte[] b)
      - 입력 스트림으로부터 읽어서 byte 배열에 저장
      - 읽어 들인 바이트 개수를 리턴함
      3) int read(byte[] b, int off, int len)
      4) int availabel()
      - 다음 read()할 때, 블로킹 없이 입력 스트림에서 읽을 수 있는 데이터 길이
      5) long skip(long n)
      - 입력 스트림에서 n 바이트를 건너 뜀
      6) void mark(int readlimit), void reset()
      - 현재 읽은 위치 기억 및 위치 이동

  2. OutputStream 클래스
    바이트 단위 출력 스트림 클래스의 최상위 클래스
    추상 클래스이며, 이것의 하위 클래스는 (…)OutputStream

    • 주요 메소드
      1) void write(int b)
      - 1바이트의 데이터를 출력 스트림에 씀
      2) void write(byte[] b)
      - byte 배열의 내용을 출력 스트림에 씀
      3) void write(byte[] b, int off, int len)
      4) void close()
      5) void flush()

캐릭터 스트림

  1. Reader 클래스
    입력용 캐릭터 단위 스트림 클래스의 최상위 클래스
    추상 클래스이며 이것의 하위 클래스는 (…)Reader

    • 주요 메소드
      1) int read()
      - 1개 문자(2바이트)를 읽어 리턴함
      2) int read(char[] cbuf)
      - 문자를 읽어 char 배열에 저장함
      - 읽어 들인 문자의 개수를 리턴함
      3) boolean ready()
      - 스트림이 읽힐 준비가 되었으면 true를 리턴함
      4) abstract void close()
      - 입력 스트림을 닫고 자원을 반납함

  2. Write 클래스
    출력용 캐릭터 단위 스트림 클래스의 최상위 클래스
    추상 클래스이며 이것의 하위 클래스는 (…)Writer

    • 주요 메소드
      1) void write(int c)
      - 1개의 문자 2바이트를 출력함
      2) void write(char[] cbuf)
      3) void write(String str)
      4) void write(String str, int off, int len)
      5) abstract void close()

파일 입출력

  • 파일이나 디렉토리를 표한
    • 상대 또는 절대 경로를 가짐
  • 파일/디렉토리를 조작할 수 있는 메소드 제공
    • 이름과 경로의 조회
    • 파일과 디렉토리의 생성과 삭제 (입출력 메소드는 제공되지 않음)

  1. 생성자 : File(String pathname)
    • pathname은 상대 또는 절대경로로 표현될 수 있음
    • File myFile = new File(“c:\temp\data.txt”);

  2. 주요 메소드
    • boolean exists()
    • boolean isDirectory(), boolean isFile()
    • String getName()
    • String getPath()
    • long length
    • boolean createNewFile()
    • boolean delete()
    • boolean mkdir(), boolean mkdirs()
    • String[] list(), File[] listFiles()
      • File 객체에 지정된 디렉터리 안에 들어있는 파일과 서브 디렉터리들의 이름을 문자열 배열(또는 경로를 File 배열)로 반환
    • String getParent(), File getParentFile()
      • 상위 경로의 이름(또는 File 객체)을 반환
    • static File[] listRoots()
      • 루트 디렉토리들을 File 배열로 반환

RandomAccessFile 클래스

  • 파일의 임의 위치에서 읽기/쓰기가 가능
    • 파일을 오픈하고, 위치를 지정하고, 읽기/쓰기를 함
  • 읽고 쓰는 위치는 파일 포인터가 가리킴
    • 읽기(또는 쓰기)는 파일 포인터가 가리키는 위치부터 바이트 단위로 읽음(또는 씀)
  • byte 단위로 읽고 쓰며, 파일 포인터가 이동됨
    • 랜덤 엑세스 파일을 커다란 byte 배열로 볼 수 있음

1) 생성자
- RandomAccessFile(File file, String mode)
- RandomAccessFile(String name, String mode)
- mode는 읽기 전용의 “r” 또는 읽기/쓰기 겸용의 “rw”

2) 주요 메소드
- int read()
- int read(byte[] b), int read(byte[] b, int off, int len)
- void seek(long pos)
- void write(byte[] b)
- void write(byte[] b, int off, int len)

FileInputStream과 FileOutputStream 클래스

  • 파일로부터 데이터를 읽기/쓰기 위한 입력/출력용 기본 스트림
  • 바이트 단위의 입력 출력

  • 생성자
    1. FileInputStream 클래스
      • 기존 파일과 연결된 입력 스트림 객체를 생성
      • FileInputStream(File file), FileInputStream(String name)
    2. FileOutputStream 클래스
      • 기존 파일(없다면 생성)과 연결된 출력 스트림 객체를 생성
      • FileOutputStream(String name)
      • FileOutputStream(File file, boolean append)

FileReader와 FileWriter 클래스

  • 텍스트 파일을 다루기 위한 기본 스트림
  • 문자 단위의 입력/출력

  • 생성자
    1. FileReader 클래스
      • FileReader(File file)
      • FileReader(String fileName)
    2. FileWriter 클래스
      • FileWriter(File file)
      • FileWriter(String fileName)
      • FileWriter(File file, boolean append)

Console 입출력

  • 콘솔 입출력을 제공하는 클래스
    • 키보드 입력과 화면 출력을 편리하게 지원
  • 명령 프롬프트 창에서 실행해야 함
  • System.console()을 사용하여 콘솔 객체를 생성함

  • 주요 메소드
    1) String readLine()
    - 한 라인을 읽음
    2) char[] readPassword()
    - 입력할 때 화면에 보이지 않음
    3) PrintWriter writer(), Reader reader()

보조 스트림

  • 기본스트림의 성능을 높이거나 보조 기능을 제공하는 스트림
  • 입출력 기능을 직접 수행하지는 못함
  • 보조 스트림을 생성할 때, 기본 스트림 객체를 생성자의 인자로 이용함
    • 프로그램에서는 보조 스트림을 사용해 입출력하면 됨

  • 보조 스트림의 종류
    1) 버퍼링 기능의 제공
    - BuffferedInputStream
    - BufferedOutputStream
    - BufferedReader
    - BufferedWriter
    2) Java의 기본 자료형을 그대로 읽기/쓰기 위한 기능의 제공
    - DataInputStream
    - DataOutputStream
    3) 다양한 출력 형식의 제공
    - PrintStream
    - PrintWriter
    4) 텍스트 파일을 라인 단위로 읽는 메소드를 제공
    - LineNumberReader
    - 텍스트 파일을 라인 단위로 읽어 들이는 메소드 제공
    - BufferedReader의 서브 클래스
    - 주요 메소드 : String readLine(), int getLineNumber()
    5) 바이트 스트림과 캐릭터 스트림의 호환
    - InputStreamReader
    - 바이트 입력 스트림을 캐릭터 입력 스트림으로 바꾸기 위한 클래스
    - 바이트 단위로 읽은 후 문자로 바꾸어 처리함
    - 생성자는 InputStreamReader(InputStream in)
    - int read() : 1개 문자를 읽어 리턴함
    - int read(char[] cbuf, int offset, int length) - OutputStreamWriter

-

Updated: