가자미의 개발이야기

[자바] 필터 스트림 본문

Java/자바 기본 문법

[자바] 필터 스트림

가자미 2021. 2. 26. 13:20

입력 스트림은 데이터를 바이트 단위로 입출력 한다.

만약 int형 데이터를 읽어와도 바이트형으로 받아진다.

프로그램에서 int형으로 사용하려면 필터 스트림이 필요하다.

InputStream in = new FileInputStream("data.dat");	// 입력 스트림 생성
DataInputStream fIn = new DataInputStream(in);		// 필터 스트림 생성 및 연결

OutputStream out = new FileOutputStream("data.dat");	//출력 스트림 생성
DataOutputStream fOut = new DataOutputStream(out);	//필터 스트림 생성 및 연결

필터 스트림을 close하면 기본 스트림도 자연스럽게 닫힌다.

 

입출력 필터 스트림의 예

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;


public class StreamPtc {
	public static void main(String[] args) {
		try(DataOutputStream out = new DataOutputStream(new FileOutputStream("data.dat"))){
			out.writeInt(370);//int형 데이터 저장
			out.writeDouble(3.14);//double형 데이터 저장
		}
		catch(IOException e) {
			e.printStackTrace();
		}
	}
}

class DataFileterInputStream{
	public static void main(String[] args) {
		try(DataInputStream in=new DataInputStream(new FileInputStrea("data.dat"))){
			int num1=in.readInt();
			double num2 = in.readDouble();
		}
		catch(IOException e) {
			e.printStackTrace();
		}
	}
}

 

버퍼링 기능을 제공하는 필터 스트림

class BufferedStreamFileCopier{
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		System.out.print("대상 파일 : ");
		String src = sc.nextLine();
		System.out.print("사본 이름 : ");
		String dst = sc.nextLine();
		
		try(BufferedInputStream in = new BufferedInputStream(new FileInputStream(src));
				BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream(dst))) {
					int data;
					while(true) {
						data=in.read();//바이트씩 복사해도 버퍼링되므로 속도가 빠름
						if(data==-1)
							break;
						out.write(data);
					}
				}
		catch(IOException e) {
			e.printStackTrace();
		}
	}
}

 

#더 알아보기# 출력 스트림 대상의 flush()메소드. 즉시 버퍼에 있는 데이터를 출력시킴

 

버퍼링과 필터 스트림을 모두 쓰고 싶을 경우(필터-버퍼링-입출력스트림 순으로 만들자)

class BufferedDataOutputStream{
	public static void main(String[] args) {
		try(DataOutputStream out=
				new DataOutputStream(
						new BufferedOutputStream(
								new FileOutputStream("data.dat")))){
			out.writeInt(370);
			out.writeDouble(3.15);
		}
		catch(IOException e) {
			e.printStackTrace();
		}
	}
}