[Java 기능] 보조 스트림 클래스

2022. 2. 17. 15:12·Java & Kotlin

보조 스트림

  • 실제로 읽고 쓰는 스트림이 아닌 보조 기능을 제공하는 스트림
  • FilterInputStream과 FilterOutputStream이 보조 스트림의 상위 클래스들
  • 셍성자의 매개변수로 또 다른 스트림(기반 스트림이나 다른 보조 스트림)을 가짐
  • 기능을 확장하기 위해 상속을 이용하면 hierarchy 복잡해질 수 있음 → Decorator Pattern으로 구현

 

InputStreamReader와 OutputStreamWriter

InputStreamReaderTest.java
  • FileInputStream은 바이트 단위로 파일을 읽는 스트림
  • 이를 InputStreamReader로 감싸주어 바이트로 읽은 자료를 문자로 변환해줌
package ch16;

import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;

public class InputStreamReaderTest {

	public static void main(String[] args) {
		
		// 보조스트림의 매개변수로 FileInputStream 입력
		try(InputStreamReader isr = new InputStreamReader(new FileInputStream("reader.txt"))) {	
			
			int i;
			while((i = isr.read()) != -1) {
				System.out.print((char)i);
			}
		} catch(IOException e) {
			
		}
	}

}

 


BufferedInputStream과 BufferedOutputStream

FileCopyTest.java
  • a.zip 파일을 읽어 복사하여 출력하기
  • FileInputStream과 FileOutputStream만을 이용했을 때 (소요시간 약 4~5초)
package ch16;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

public class FileCopyTest {

	public static void main(String[] args) {
		
		long millisecond = 0;
		
		try(FileInputStream fis = new FileInputStream("a.zip"); FileOutputStream fos = new FileOutputStream("copy.zip")) {
			
			millisecond = System.currentTimeMillis();
			
			int i;
			while((i = fis.read()) != -1) {
				fos.write(i);
			}
			
			millisecond = System.currentTimeMillis() - millisecond;	// 복사 소요 시간
			
		} catch (IOException e){
			e.printStackTrace();
		}
		
		System.out.println(millisecond);
	}

}

 

  • BufferedInputStream과 BufferedOutputStream을 이용하면 입출력 소요 시간이 줄어듦 (약 0.02초)
try(BufferedInputStream bis = new BufferedInputStream(new FileInputStream("a.zip"));
				BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("copy.zip")))

 

  • 여러 개의 보조 스트림이 있는 예시
  • 마지막 매개 변수로 들어간 스트림이 기반 스트림
Socket socket = new Socket();

//	socket.getInputStream().read(); 바이트 단위로만 읽음
InputStreamReader isr = new InputStreamReader(socket.getInputStream().read());	// 바이트를 읽어들여 문자로 변환
BufferedReader br = new BufferedReader(isr);	// 더 빠르게 입출력 가능
br.readLine();	// BufferedReader에만 있는 메서드, 한줄씩 읽음
}

 

 


DataInputStream과 DataOutputStream

  • 자료가 메모리에 저장된 상태 그대로 읽거나 쓰는 스트림
DataStreamTest.java
  • write로 출력한 데이터 타입 순서대로 read 해야 함
  • 데이터 타입을 다르게 읽어들이면 전혀 다른 값이 읽힘
public class DataStreamTest {

	public static void main(String[] args) {


		try(FileOutputStream fos = new FileOutputStream("data.txt");
				DataOutputStream dos = new DataOutputStream(fos))
		{
		
			dos.writeByte(100);
			dos.writeChar('A');
			dos.writeInt(10);
			dos.writeFloat(3.14f);
			dos.writeUTF("Test");
		}catch(IOException e) {
			e.printStackTrace();
		}
		
		try(FileInputStream fis = new FileInputStream("data.txt");
				DataInputStream dis = new DataInputStream(fis))
		{
		
			System.out.println(dis.readByte());
			System.out.println(dis.readChar());
			System.out.println(dis.readInt());
			System.out.println(dis.readFloat());
			System.out.println(dis.readUTF());
		}catch (IOException e) {
			e.printStackTrace();
		}
	}
}
저작자표시 비영리 변경금지 (새창열림)

'Java & Kotlin' 카테고리의 다른 글

[Java 기능] 직렬화  (0) 2022.02.17
[Java 기능] 문자 단위 입출력 스트림  (0) 2022.02.17
[Java 기능] 바이트 단위 입출력 스트림  (0) 2022.02.17
'Java & Kotlin' 카테고리의 다른 글
  • [Java 기능] 그외 여러가지 입출력 클래스들
  • [Java 기능] 직렬화
  • [Java 기능] 문자 단위 입출력 스트림
  • [Java 기능] 바이트 단위 입출력 스트림
Sue
Sue
개발 공부 로그
  • Sue
    Sue's devlog
    Sue
  • 전체
    오늘
    어제
    • 분류 전체보기 (122)
      • Algorithm (2)
      • WEB (8)
      • Java & Kotlin (83)
      • Spring (26)
      • Database (1)
      • Infra (0)
      • Git (1)
      • devlog (1)
  • 인기 글

  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
Sue
[Java 기능] 보조 스트림 클래스
상단으로

티스토리툴바