주 메뉴 열기

입출력 스트림

라이언양 (토론 | 기여)님의 2019년 12월 27일 (금) 17:53 판

목차

1 소개

자바에서 데이터는 스트림(Stream)을 통해 입출력됩니다. 스트림은 단일 방향으로 연속적으로 흘러가는 것을 말하는데, 물이 높은 곳에서 낮은 곳으로 흐르듯이 데이터는 출발지에서 도착지로 흘러갑니다.

프로그램이 출발지냐 또는 도착지냐에 따라서 사용하는 스트림의 종류가 결정됩니다. 프로그램이 도착지이면 흘러온 데이터를 입력받아야 하므로 입력 스트림을 사용합니다. 반대로 프로그램이 출발지면 데이터를 출력해야 하므로 출력 스트림을 사용합니다.

2 입출력 스트림의 종류

java.io 패키지에는 여러 가지 종류의 스트림(Stream) 클래스를 제공하고 있습니다. 이들 스트림 클래스는 다음과 같이 크게 두 종류로 구분됩니다.

  • 바이트(byte) 기반 스트림: 그림, 멀티미디어 등의 바이너리 데이터를 읽고 출력할 때 사용
  • 문자(character) 기반 스트림: 문자 데이터를 읽고 출력할 때 사용

스트림 클래스가 바이트 기반인지, 문자 기반인지를 구별하려면 최상위 클래스를 보면 됩니다. 바이트 기반 스트림의 최상위 입력 스트림은 InputStream, 최상위 출력 스트림은 OutputStream 이고, 하위 클래스의 Suffix에는 항상 -InputStream 또는 -OutputStream 으로 끝는다. 문자 기반 스트림의 최상의 입력 스트림은 Reader, 최상위 출력 스트림은 Writer 이고, 하위 클래스의 Suffix에는 항상 -Reader 또는 -Writer 로 끝난다.

3 보조 스트림

보조 스트림이란 다른 스트림과 연결이 되어 여러 가지 편리한 기능을 제공해주는 스트림을 말합니다. 보조 스트림은 자체적으로 입출력을 수행할 수 없기 때문에 입출력 소스와 바로 연결되는 InputStream, OutputStream, Reader, Writer 등에 연결해서 입출력을 수행합니다. 보조 스트림은 문자 변환, 입출력 성능 향상, 기본 타입 입출력 등의 기능을 제공합니다.

프로그램은 입력 스트림으로부터 직접 데이터를 읽지 않고, 보조 스트림에서 제공하는 기능을 이용해서 데이터를 읽습니다. 반대로 출력 스트림으로 직접 데이터를 보내지 않고 보조 스트림에서 제공하는 기능을 이용해서 데이터를 보냅니다.

3.1 보조 스트림 연결하기

보조 스트림을 연결하려면 보조 스트림을 생성할 때 자신이 연결될 스트림을 다음과 같이 생성자의 매개값으로 제공하면 됩니다.

보조스트림 변수 = new 보조스트림(연결스트림)

예를 들어 InputStream을 문자 변환 보조 스트림인 InputStreamReader에 연결하는 코드는 다음과 같습니다.

InputStream is = ...;
InputStreamReader isr = new InputStreamReader(is);

보조 스트림의 생성자 매개값은 InputStream, OutputStream, Reader, Writer 이외에 또 다른 보조 스트림이 될 수 있습니다. 이 말은 보조 스트림을 연속적으로 연결할 수 있다는 뜻입니다. 예를 들어 다음과 같이 문자 변환 보조 스트림인 InputStreamReader를 다시 성능 향상 보조 스트림인 BufferedReader에 연결할 수 있습니다.

InputStream is = System.in;
InputStreamReader isr = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isr);

3.2 문자 변환 보조 스트림

OutputStreamWriter는 바이트 기반 출력 스트림에 연결되어 문자 출력 스트림인 Writer로 변환하는 보조 스트림입니다.

<nowiki>
Writer writer = new OutputStreamWriter(바이트 기반 출력 스트림);
<nowiki>

예를 들어 파일 출력을 위한 바이트 기반 FileOutputStream을 다음과 같이 Writer 타입으로 변환할 수 있습니다.

FileOutputStream fos = new FileOutputStream("/home/ryanyang/tmp/test");
Writer w = new Writer(fos);

InputStreamReader는 바이트 기반 입력 스트림에 연결되어 문자 입력 스트림인 Reader로 변환하는 보조 스트림입니다.

Reader r = new InputStreamReader(바이트 기반 입력 스트림);

예를 들어, 파일 입력을 위한 바이트 기반 FileInputStream을 다음과 같이 Reader 타입을 변환할 수 있습니다.

FileInputStream fis = new FileInputStream("/home/ryanyang/tmp/test");
Reader r = new InputStreamReader(fis);
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.Reader;
import java.io.Writer;

public class CharacterConvertStream {
  public static void main(String[] args) {
    try {
      write("문자 변환 스트림을 사용합니다.");
      String data = read();
      System.out.println(data);
    } catch(Exception e) {}
  }

  public static void write(String str) throws Exception {
    FileOutputStream fos = new FileOutputStream("./CharacterConvertStream.txt");
    Writer writer = new OutputStreamWriter(fos);
    writer.write(str);
    writer.flush();
    writer.close();
  }

  public static String read() throws Exception {
    FileInputStream fis = new FileInputStream("./CharacterConvertStream.txt");
    Reader r = new InputStreamReader(fis);

    char[] buffer = new char[128];
    int readCharNum = r.read(buffer);
    r.close();
    String data = new String(buffer, 0, readCharNum);

    return data;
  }
}