본문 바로가기

Programming

[JAVA] 출력 스트림 ( OutputStream )

728x90
반응형

■ 출력 스트림 ( OutputStream )

출력 스트림은 입력 스트림과 짝을 이룬다.

InputSream ↔ OutputStream

FileInputSream ↔ FileOutputStream

OutputStream 의 대표적인 메소드 두가지가 있다.

- public abstract void write(int b) throw IOException

- public void close() throw IOException

write 메소드가 abstract로 선언되어 있는 이유는 InputStream과 같은 이유다. 그리고 close 메소드는 출력 스트림의 소멸에 사용된다. 사용의 예를 간단히 들어 보겠다.

OutputStream out = new FileOutputStream(output.bin);

out.write(bData );

out.close();

와 같이 사용이 될 것이다. write메소드를 통해서 output.bin에 bData의 정보가 출력 될 것이다.


입 출력 스트림을 동시에 생성해야하는 예제를 들어보겠다

import java.io.*;

class ByteFileCopy{

public static void main(String[] argv) {

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

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


int copyByte = 0;

int bDate;

while(true)

{

bData = in.read();

if(bData == -1)

break;

out.write(bData);

copyByte++;

}

in.close();

out.close();

System.out.printf("복사된 바이트 크기 %d\n",copyByte);

}

}

1Byte씩 읽으면서 바로 데이터를 복사하고 있다. break문이 write의 위에 있는 이유는 -1을 저장할 필요가 없기때문이다.

이제 정보를 복사하는 법을 알 수 있다. 하지만 이 방법으로는 일정이상의 데이터를 읽어 오기에는 한계가 있다. 그 이유는 바이트 크기로 읽어 오기 때문에 느리기 때문이다. 

■ 조금 더 빠른 입 출력 스트림

위에서의 방법으로 충분히 데이터를 입력하고 출력 할 수 있다. 하지만 매우 느리다. 그래서 한가지 방법을 더 소개 하면은 바이트 단위 복사가 아닌 버퍼를 이용하여 복사이다. 버퍼란 바이트형 배열을 말한다. 방법은

public int read(byte[] b) throws IOException()

메소드를 사용하는 것이다. 보면 인자로 바이트형 배열을 참조한다.  사용시에는 입력 스트림을 통해서 읽어 들여진 데이터가 배열에 저장 되면 실제로 읽어 들인 데이터의 바이트 크기를 반환한다. 물론 더이상 읽을 정보가 없다면 -1을 반환한다. 하지만 1KB단위의 복사를 진행할려면 OutputStream 클래스의 메소드를 하나 사용해야 한다.

public void write(byte[] bData , int off, int len) throws IOException

위 메소드는 매개변수 bData에 전달된 배열을 대상으로 off 의 인덱스 위치부터 len크기의 바이트를 출력 스트림을 통해서 전송하는 메소드이다. 사용의 예로는

import java.io.*;

class ByteFileCopy{

public static void main(String[] argv) {

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

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


int copyByte = 0;

int readLen;

byte buf[] = new byte[1024]

while(true)

{

readLen = in.read(buf);

if(readLen == -1)

break;

out.write(buf, 0, readLen);

copyByte += readLen;

}

in.close();

out.close();

System.out.printf("복사된 바이트 크기 %d\n",copyByte);

}

}

실제로 채워진 데이터의 크기는 수 readLen에 저장된다.


반응형

'Programming' 카테고리의 다른 글

[Android] View  (0) 2013.09.29
[Info] 프로그래밍 언어  (0) 2013.06.15
[JAVA] FileInputStream과 InputStream  (0) 2013.06.06
[JAVA] I/O모델과 스트림  (0) 2013.06.05
[JAVA] I/O 스트림  (0) 2013.06.05