[JAVA] 자바 정복기 - 보조 스트림

개발log·2024년 4월 11일

NEW 자바 정복기

목록 보기
27/27
post-thumbnail

보조 스트림

  • 기본 스트림을 직접 사용해서 데이터를 입출력할 수도 있지만, 데이터를 변환해서 입출력하거나 데이터의 출력 형식을 저장하려는 경우 등에는 보조 스트림을 연결하여 사용하면 편리하다.
  • 다른 스트림과 연결되어 여러가지 편리한 기능을 제공하는 스트림
  • 자체적으로 입출력 수행할 수 없기 때문에 InputStream, OutputStream, Reader, Writer 등에 연결
  • 프로그램은 입출력 스트림으로부터 직접 데이터 읽지 않고, 보조 스트림에서 제공하는 기능 이용

보조 스트림 연결

  • 보조 스트림 생성 시 자신이 연결될 스트림을 생성자의 매개값으로 제공
보조스트림 변수 = new 보조스트림(연결스트림);
InputStream is = ...;
InputStreamReader reader = new InputStreamReader(is);

  • 보조 스트림을 연속적으로 연결할 수 도 있음
InputStream is = System.in;
InputStreamReader reader = new InputStreamReader(is);
BufferedReader br = new BufferedReader(reader);


문자 변환 보조 스트림

  • 소스 스트림이 바이트 기반 스트림이면서 입출력 데이터가 문자일 경우 Reader와 Writer로 변환해서 사용하는 것이 편리함

OutputStreamReader

  • 바이트 기반 출력 스트림에 연결되어 문자 출력 스트림인 Writer로 변환하는 보조 스트림
Writer writer = new OutpurStreamWirter(바이트 기반 출력 스트림);
FileOutputStream fos = new FileOutputStream("C:/Temp/test.txt");
Writer writer = new OutputStreamWriter(fos);

InputStreamReader

  • 바이트 기반 입력 스트림에 연결되어 문자 입력 스트림인 Reader로 변환하는 보조 스트림
Reader reader = new InputStreamReader(바이트 기반 입력 스트림);
FileInputStream fis = new FileInputStream("C/Temp/test.txt");
Reader reader = new InputStreamReader(fis);

성능 향상 보조 스트림

  • 메모리 버퍼를 추가로 제공하여 프로그램의 실행 성능을 향상
  • 바이트 기반 스트림에 연결: BufferInputStream, BufferOutputStream
  • 문자 기반 스트림에 연결: BufferReader, BufferWriter

출력 성능 향상 보조 스트림

  • BufferedOutputStream, BufferedWriter
  • 프로그램의 출력 성능은 입출력이 가장 늦은 장치를 따라 감(하드 디스크, 느린 네트워크)
  • 중간에 버퍼를 둠으로써 프로그램의 실행 성능을 향상시킬 수
BufferedOutputStream bos = new BufferOutputStream(바이트 기반 출력 스트림);
BufferedWriter bw = new BufferWriter(문자 기반 출력 스트림);

입력 성능 향상 보조 스트림

  • BufferedInputStream, BufferedReader
  • 프로그램의 입력 성능은 입력이 가장 늦은 장치를 따라 감(하드 디스크, 느린 네트워크)
  • 중간에 버퍼를 둠으로써 데이터를 미리 읽고 버퍼에 저장해 둠(속도 차이 다소 해결)
  • 프로그램은 버퍼에 있는 데이터를 한번에 많이 읽을 수 있음(예: 라인 단위로 읽을 수 있음)
BufferedInputStream bis = new BufferedInputStream(바이트 기반 입력 스트림);
BufferedReader br = new BufferedReader(문자 기반 입력 스트림);
  • BufferedReader는 라인 단위로 문자열 읽는 readLine() 메소드 제공
    [Enter]키 이전의 모든 문자열 읽고 리턴
    키보드에서 입력한 내용 및 파일 내용을 라인 단위로 읽을 수 있음
  • 라인 단위로 구분된 문자열
01 JAVA
02 C
03 Python

기본 타입 입출력 보조 스트림

DataInputStream과 DataOutputStream

  • 기본 타입인 boolean, char, short, int, long, float, double, UTF-8 문자열을 매우 쉽게 입출력

  • 객체 생성 코드

DataInputStream dis = new DataInputStream(바이트 기반 입력 스트림);
DataOutputStream dos = new DataOutputStream(바이트 기반 출력 스트림);

  • 데이터 타입의 크기가 모두 다르므로 DataOutputStream으로 출력한 데이터를 다시 DataInputStream으로 읽어올 때는 출력한 순서와 동일한 순서로 읽어야 함
  • 기본 타입 입출력
public class DataInputStreamExample{
	public static void main(String[] args) throws Exception {
    // 바이ㅏ트 기반 출력 스트림을 생성하고 DataOutputStream 보조 스트림 연결
    	FileOutputStream fos = new FileOutputStream(fos);
        
        //기본 타입 값 출력
        dos.writeUTF("홍길동");
        dos.writeDouble(95.5);
        dos.writeInt(1);
    }
}

프린트 보조 스트림

  • 프린터와 유사하게 출력하는 print(), println() 메소드 가진 보조 스트림
    PrintStream: 바이트 기반 출력 스트림과 연결
    PrintWriter: 문자 기반 출력 스트림과 연결
  • println()은 개행 문자 \n 추가하여 줄바꿈이 일어나도록 함
  • printf()는 형식에 맞추어 데이터를 출력함
PrintStream ps = new PrintStream(바이트 기반 출력 스트림);
PrintWriter pw = new PrintWriter(문자 기반 출력 스트림);


객체 입출력 보조 스트림

ObjectOutputStream과 ObjectInputStream

  • 메모리에 생성된 객체를 파일 또는 네트워크로 출력
  • 객체 직렬화 및 역직렬화
    ObjectOutputStream: 객체 직렬화에서 출력(객체를 바이트 배열로)
    ObjectInputStream: 객체 역직렬화에서 복원(바이트 배열을 객체로)
ObjectInputStream ois = new ObjectInputStream(바이트 기반 입력 스트림);
ObjectOutputStream oos = new ObjectOutputStream(바이트 기반 출력 스트림);
  • ObjectOuptputStream의 writeObject()는 객체 직렬화하여 바이트를 출력 스트림으로 보냄
oos.writeObject(객체);
  • ObjectInputStream의 readObject()는 바이트를 읽고 역직렬화하여 객체로 다시 복원해서 리턴
    원래 타입으로 강제변환 필요
객체타입 변수 = (객체타입) ois.readObject();
  • 자바는 java.io.Serializable 인터페이스 구현한 객체만 직렬화함
    Serializable은 추상 메소드가 없으므로, 클래스 선언 시 implements Serializable 추가하기만 하면 됨
public class XXX implements Serializable {...}

정리

  • 보조 스트림: 다른 스트림과 연결되어 여러 편리한 기능 제공해주는 스트림. 자체적으로 입출력 수행할 수 없기 때문에 입출력 소스와 바로 연결되는 InputStream, OutputStream, Reader, Writer 등에 연결해서 입출력 수행. 문자 변환, 입출력 성능 향상, 기본 타입 입출력 등 기능 제공
  • 문자 변환: 소스 스트림이 바이트 기반 스트림이면서 입출력 데이터가 문자라면 Reader와 Writer로 변환해서 사용하는 것이 편리함. OutputStreamWriter는 Writer로 변환하는 보조 스트림이며, InputStreamReader는 Reader로 변환하는 보조 스트림
  • 성능 향상: 메모리 버퍼 추가로 제공하여 프로그램의 실행 성능을 향상시키는 것들이 있음. 바이트 기반 스트림에서는 BufferedInputStream, BufferedOutputStream, 문자 기반 스트림에서는 BufferedReader, BufferedWriter가 있음
  • 기본 타입 입출력: DataInputStream과 DataOutputStream 보조 스트림 연결하면 기본 타입인 boolean, char, short, int, long, float, double 입출력 가능
  • 개행 출력: PrintStreamPrintWriter의 println() 메소드는 출력할 데이터 끝에 개행 문자인 \n추가하여 출력 시 콘솔이나 파일에서 줄 바꿈 일어남
profile
나의 개발 저장소

0개의 댓글