달력

3

« 2024/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

'filter Stream'에 해당되는 글 1

  1. 2011.08.02 필터 스트림 1
2011. 8. 2. 18:16

필터 스트림 I.lib()/I.lib(Java)2011. 8. 2. 18:16

.. .. ..
[펌] : http://force44.blog.me/130096406237

5. 필터 스트림

앞에서 본 입출력 스트림들만으로는 기능이 부족한 경우가 있다. 이런 경우에는 자신이 원하는 입출력 기능을 사용하기 위하여 기존의 스트림에 필터를 적용하게 된다. (2차 스트림이라고도 부른다.)

필터 스트림(2차 스트림)은 기본 스트림의 기능을 확장시키거나 사용하기 쉽게 변환해주는 스트림으로써 많은 데이터를 입출력해야 할 경우에도 자주 사용된다. 예를들어 FileReader 스트림 클래스 자체에는 줄 단위로 읽어 들이는 메서드가 존재 하지 않지만 filter스트림을 상속받은 BufferedReader는 줄 단위로 읽는 메서드가 존재 하기 때문에 사용하면 속도가 빠르다.


1. FilterInputStream


FilterInputStream 클래스는 필터 바이트 입력 스트림이므로 실제 데이터 원본과 연결된 바이트 입력 스트림을 내부적으로 가지고 있다. 그리고 이 바이트 입력 스트림으로부터 데이터를 읽고, 원하는 형태로 변환하기 위한 기능을 추가적으로 제공해준다.


2. FilterOutputStream


FilterOutputStream 클래스는 필터 바이트 출력 스트림이므로 실제 데이터 대상과 연결된 바이트 출력 스트림을 내부적으로 가지고 있다. 이 바이트 출력 스트림데이터를 쓰기 전에, 데이터를 원하는 형태로 변환하기 위한 기능을 추가적으로 제공해 준다.


3. Data Stream

일반적인 스트림은 바이트나 문자 단위의 처리를 기본으로 하는 스트림이다. 바이트나 문자 단위가 아닌 데이터 타입 단위의 처리를 하고자 할때 도 있다. 가령 int 형 숫자 100을 스트림에 기록한다면 1바이트 저장하는 방식이기 때문에 100은 1바이트로 기록될 것이다. 데이터를 읽어올 때도 당연히 1바이트를 기준으로 읽어오게 된다. 1바이트가 아닌 int형(4바이트)으로 메모리에 기록하고 싶다면 Data 스트림을 이용하면 된다.

DataInputStream과 DataOutputStream은 각각 Filter In/Out스트림을 상속받은 클래스로서 기본 데이터를 직접 읽고 쓸수 있도록하는 클래스이다.


3.1 DataOutputStream


파일 출력을 위해서 FileOutputStream 객체를 생성할 때에는 출력 파일명을 생성자에 직접 기술했었다. 하지만 DataOutputStrea 객체를 생성하기 위해서는 파일명을 직접 기술하지 못한다. 그림에서와 같이 File에 바로 접근하는게 아니고 FileOutputStream으로 접근하기 때문이다.

예1 - DataOutputStream 생성하기

FileOutputStream fos = new FileOutputStream("ㅅㅂ.txt");

DataOutputStream dos = new DataOutputStream(fos);

/* 두줄을 한줄로 DataOuputStream의 매개변수로 바로 FileOutStream 객체 생성

DataOutputStream dos = new DataOutputStream(new FileOutputStream("ㅅㅂ.txt"));

*/


3.2 DataInputStream

DataInputStream 클래스 역시 파일로 데이터를 읽어오기 위해서는 파일명을 직접 쓸수 없다.


그림에서와 같이 FileInputStream으로 받은 Data를 원하는 스트림으로 변하기 위해서 DataInputStream을 사용하는 것이다.

예2 - DataInputStream 생성하기

FileInputStream fis = new FileInputStream("ㅅㅂ.txt");

DataInputStream dis = new DataInputStream(fis);

// 역시 한줄로 쓸수 있다.


※ 학생 정보를 파일에 저장하고 읽어오는 프로그래밍을 보자.

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

예3 - DataInputStream과 DataOutputStream 사용해보기

//파일에 학생정보 입력하기

FileOutputStream fos = new FileOutputStream("ㅅㅂ.dat");

DataOutputStream dos = new DataOutputStream(fos);

String name = "니나노";

String address = "현실은 시궁창"; //이름과 주소를 저장하기 위해 String

int age = 23 ; //나이를 저장하기 위해 int

double height = 160.6; // 키를 저장하기 위해 double

dos.writeUTF(name); // Stirng으로 읽어오기위한 메서드

dos.writeUTF(address);

dos.writeInt(age);

dos.writeDouble(height);

dos.close();

fos.close();

//입력된 파일을 읽기

FileInputStream fis = new FileInputStream("ㅅㅂ.dat");

DataInputStream dis = new DataInputStream(fis);

String r_name = dis.readUTF();

String r_address = dis.readUTF();

int r_age = dis.readInt();

double r_height = dis.readDouble();

System.out.println(r_name + "," + r_address + "," + r_age + "," + r_height);

dis.close();

fis.close();

run:

니나노,현실은 시궁창,23,160.6

BUILD SUCCESSFUL (total time: 0 seconds)



버퍼 스트림도 필터 스트림의 일종으로 메모리 버퍼를 사용하여 데이터를 입출력하는 스트림이다. 버퍼를 사용하기 때문에 데이터를 읽고 쓰는 속도를 향상할 수 있다. 버퍼 메모리에 data가 다 차면 일괄처리 하는 것이다.


예4 - 버퍼 스트림을 이용한 복사와 그냥 복사 차이를 알아보자

public class Main {

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

int i, len=0 ;

//그냥 스트림으로 연결

FileInputStream fis = new FileInputStream("lotto.txt");

FileOutputStream copy_file = new FileOutputStream("lottoCopy.txt");

long time = System.currentTimeMillis();

while ((i= fis.read()) != -1){

copy_file.write(i);

len++;

}

time = System.currentTimeMillis() - time;

fis.close(); copy_file.close();

System.out.println(len + " byte" + "," + time +"milisec");

}

run:

8507 byte,78milisec

BUILD SUCCESSFUL (total time: 1 second)

버퍼 스트림 이용

public class Main {

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

int i, len=0 ;

//버퍼스트림 생성자로 객체생성 대입 //한줄

BufferedInputStream bis = new BufferedInputStream(new FileInputStream("lotto.txt"));

BufferedOutputStream bos

= new BufferedOutputStream(new FileOutputStream("b_lottoCopy.txt"));

long time = System.currentTimeMillis();

while ((i= bis.read()) != -1){

bos.write(i);

len++;

}

time = System.currentTimeMillis() - time;

bis.close(); bos.close();

System.out.println(len + " byte" + "," + time +"milisec");

}

}

run:

8507 byte,16milisec

BUILD SUCCESSFUL (total time: 0 seconds)

78 milsec -> 16 milsec 으로 줄었다. ★ 버퍼 스트림을 쓰는 가장 큰이유

'I.lib() > I.lib(Java)' 카테고리의 다른 글

dwr 사용방법  (0) 2012.03.22
JAVA 로 MAIL 보내기.(SMTP 방식?! )  (2) 2011.09.26
JAVA에서 엑셀 파일 읽고 쓰기  (0) 2011.07.04
Spy 설정 방법.  (1) 2011.03.31
SPY 설정 방법. ( tomcat + axis2 + ibatis )  (0) 2010.10.28
.
:
Posted by .07274.