상세 컨텐츠

본문 제목

[Java]필터 스트림

JAVA Language

by mobile 2012. 9. 24. 02:47

본문

반응형

▶ 기본 자료형 단위로 데이터를 읽고 쓰게 하는 필터 스트림

- 필터 입력 스트림 클래스 :  FilterInputStream 클래스를 상속한다.

- 필터 출력 스트림 클래스 : FilterOutputStream 클래스를 상속한다.

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 DataFilterStream {


public static void main(String[] args) throws IOException {


OutputStream out = new FileOutputStream("data.bin");

DataOutputStream filterOut = new DataOutputStream(out);

filterOut.writeInt(275);

filterOut.writeDouble(45.79);

filterOut.close();

InputStream in = new FileInputStream("data.bin");

DataInputStream filterIn = new DataInputStream(in);

int num1 = filterIn.readInt();

double num2 = filterIn.readDouble();

filterIn.close();

System.out.println(num1);

System.out.println(num2);

}

}



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

- BufferedInputStream  : 버퍼 필터 입력 스트림

- BufferedOutputStream : 버퍼 필터 출력 스트림

import java.io.BufferedInputStream;

import java.io.BufferedOutputStream;

import java.io.FileInputStream;

import java.io.FileOutputStream;

import java.io.IOException;

import java.io.InputStream;

import java.io.OutputStream;


public class ByteBufferedFileCopy {


public static void main(String[] args) throws IOException {


InputStream in = new FileInputStream("org.bin");

OutputStream out = new FileOutputStream("cpy.bin");

BufferedInputStream bin = new BufferedInputStream(in);

BufferedOutputStream bout = new BufferedOutputStream(out);

int copyByte = 0;

int bData;

while(true) {

bData = bin.read();

if(bData == -1)

break;

bout.write(bData);

copyByte++;

}

bin.close();

bout.close();

System.out.println("복사된 바이트 크기" + copyByte);

}

}

[버퍼의 크기를 지정하는 생성자]

- public BufferedInputStream(InputStream in, int size)

- public BufferedOutputStream(OutputStream out, int size);


BufferedInputStream이 내부에 지니는 버퍼를 무조건 채우게 된다. 프로그램상에서 요청하지 않아도, 즉 read 메소드가 호출 되지 않아도, 즉 read 메소드가 호출 되지 않아도 입력 스트림으로 부터 데이터를 읽어 들여서 버퍼를 무조건 채우게 된다. 그 다음, 프로그램상에서 다음 두 메소드의 호출을 통해서 데이터를 읽어 들이는 경우, 버퍼에 저장해 놓은 데이터를 반환해 준다. 물론 그로 인해서 생기는 버퍼의 빈 공간은 다시 입력 스트림으로 부터 데이터를 채우게 된다.


public int read() throws IOException

public int read(byte[] b, int off, int len) throws IOException


▶ 버퍼링 기능에 대한 대책, flush 메소드의 호출

"데이터가 버퍼 필드 스트림에 저장되어 있는 상황에서(아직 출력 스트림을 통해서 파일로 전송되지 않은 상황에서) 컴퓨터의 전원이 나가거나 운영체제 오류로 프로그램이 그냥 종료되는 상황"

데이터의 중요도가 높거나, 버퍼가 꽉차지 않아도 출력 스트림을 통해서 파일에 저장해야 할 데이터가 존재한다면 다음의 메소드를 호출해야 한다.

public void flush() throws IOException


BufferedOutputStream 클래스에 정의되어 있는 메소드는 버퍼를 비우는 역할을 한다.여기서 버퍼를 비운다는 것은 버퍼에 저장된 데이터를 출력 스트림으로 전송해서 파일에 저장함을 의미한다. 

import java.io.BufferedInputStream;

import java.io.BufferedOutputStream;

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 DataBufferFilterStream {


public static void main(String[] args) throws IOException {

OutputStream out = new FileOutputStream("data.bin");

BufferedOutputStream bufFilterOut = new BufferedOutputStream(out);

DataOutputStream dataFilterOut = new DataOutputStream(bufFilterOut);

dataFilterOut.writeInt(275);

dataFilterOut.writeDouble(45.79);

dataFilterOut.close();

InputStream in = new FileInputStream("data.bin");

BufferedInputStream bufFilterIn = new BufferedInputStream(in);

DataInputStream dataFilterIn = new DataInputStream(bufFilterIn);

int num1 = dataFilterIn.readInt();

double num2 = dataFilterIn.readDouble();

dataFilterIn.close();

System.out.println(num1);

System.out.println(num2);

}

}


import java.io.BufferedOutputStream;

import java.io.DataOutputStream;

import java.io.FileOutputStream;

import java.io.IOException;

import java.io.OutputStream;


public class DataBufferedFilterPerformance {


public static void performanceTest(DataOutputStream dataOut) throws IOException {

long startTime = System.currentTimeMillis();

for(int i=0; i < 10000; i++) {

for(int j=0; j<10000; j++) {

dataOut.writeDouble(12.345);

}

}

dataOut.flush();

long endTime = System.currentTimeMillis();

System.out.println("경과시간 : " + (endTime-startTime));

}

public static void main(String[] args) throws IOException {

// TODO Auto-generated method stub

OutputStream out1 = new FileOutputStream("data1.bin");

DataOutputStream dataOut = new DataOutputStream(out1);

performanceTest(dataOut);

dataOut.close();

OutputStream out2 = new FileOutputStream("data1.bin");

BufferedOutputStream bufFilterOut = new BufferedOutputStream(out2, 1024*10);

DataOutputStream dataBufOut = new DataOutputStream(bufFilterOut);

performanceTest(dataBufOut);

dataBufOut.close();

}

}


반응형

관련글 더보기

댓글 영역