본문 바로가기

BackEnd/구 생활코딩 자바

필터 스트림의 이해와 활용

반응형

1. 필터 스트림이란?



필터 스트림이란 바이트단위로 읽어들인 데이터를 다른 형으로 바꾸어주는 것을 말한다.


data.bin파일에서 데이터를 읽어 들이기 위해 인풋스트림을 만들었는데, 이 인풋스트림


은 바이트단위 또는 바이트 배열단위로 데이터를 읽어들인다. 그래서 data.bin안에 있는 4바이


트 int형 데이터를 읽어 들이면 int형으로 읽어들이는게 아니라 바이트로 쪼개서 읽어 들인다.


그렇기 때문에 이 바이트단위의 데이터를 다시 int형으로 조합을 해줘야 하는것이다.


이 역할을 하는것이 바로 필터 스트림이다.


그리고 이 필터 스트림 또한 입력스트림과 출력스트림 2가지가 있다.


읽어 들일때 변환해서 읽는것과 , 출력할때도 변환해서 출력을 하는것이다.


2.  기본 자료형 변환 데이터 입출력 필터 스트림


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
package Chapter24;
import java.io.*;
 
class DataFilterStream
{
    public static void main(String[] args) throws IOException
    {
        OutputStream out = new FileOutputStream("C:\\upload\\test3.txt");
        
        DataOutputStream filterOut = new DataOutputStream(out);//필터스트림을 파일 아웃풋 스트림에 연결
        
        filterOut.writeInt(275);
        filterOut.writeDouble(45.79);
        filterOut.close();//필터스트림 파일 아웃풋스트림 같이 소멸
        
        InputStream in=new FileInputStream("C:\\upload\\test3.txt");
        
        DataInputStream filterIn = new DataInputStream(in);//필터스트림을 파일인풋스트림에 연결
        
        
        int num1 = filterIn.readInt();
        double num2 = filterIn.readDouble();
        int num3 = filterIn.readInt();
        filterIn.close();
        
        System.out.println(num1);
        System.out.println(num2);        
    }
}
cs


1
2
275
45.79
cs


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



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
package Chapter24;
import java.io.*;
 
class d_ByteBufferedFileCopy
{
    public static void main(String[] args) throws IOException
    {
        InputStream in = new FileInputStream("C:\\upload\\test3.txt");
        
        OutputStream out = new FileOutputStream("C:\\upload\\test3.txt");
        
        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);
    }
}
cs


이 필터는 읽고 쓰는 성능의 향상을 위해 사용된다. read 메소드가 호출 되지 않아도 입력 스트림


으로부터 데이터를 읽어 들여서 버퍼를 무조건 채우게 된다.


기존에는 파일로부터 1바이트씩 읽어들여서 느리지만, 


파일로부터 버퍼에다가 무더기로 읽어 들인후


버퍼로부터 1바이트식 읽어들이게 되면 


성능 향상이 된다. 그래서 버퍼 필터 스트림을 연결하는것이다.


버퍼 스트림은, 내부적으로 버퍼(쉽게 말해서 byte형 배열)를 지니고 있다


버퍼의 크기를 지정하지 않았기 때문에 디폴트 크기의 버퍼(디폴트 크기는 2MB이 다)가 만들어


지지만,다음의 생성자들을 이용하면 버퍼의 크기도 원하는 대로 지정할 수 있다.


public BufferedlnputStream(InputStream in, int size) 


public BufferedOutputStream(OutputStream out,  int size)


그리고 BufferedOutputStream 클래스는 자신이 가지고 있는 버퍼가 꽉 찼을 때,출력 스트림으


로 데이터를 전송한다. 


추가적으로 버퍼가 꽉 차지 않아도 출력 스트림을 통해서 파일에 저장해야 할 데이터가 존재한다


면 다음의 메소드를 호출해야 한다. public void flush() throws IOException


메소드는 버퍼를 비우는 역할을 한다. 여기서 버퍼를 비운다는 것은 버퍼에 저장된 데이터를 출


력 스트림으로 전송해서 파일에 저장함을 의미한다.


4. 필터의 조합


아래와 같이 버퍼 필터 스트림 과 기본 자료형 변환 데이터 입출력 필터 스트림을 조합해서


성능도 향상시켜 두 필터를 모두 이용할수 있다. 




1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
package Chapter24;
    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;
 
class e_DataBufferedFilterStream
{
    public static void main(String[] args) throws IOException
    {
        OutputStream out=new FileOutputStream("C:\\upload\\test3.txt");
        
        BufferedOutputStream bufFilterOut=new BufferedOutputStream(out);
        
        DataOutputStream dataFilterOut=new DataOutputStream(bufFilterOut);
        
        dataFilterOut.writeInt(275);
        dataFilterOut.writeDouble(45.79);
        dataFilterOut.close();
        
        InputStream in=new FileInputStream("C:\\upload\\test3.txt");
        
        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);
    }
}
cs



반응형