출처: https://bumcrush.tistory.com/182 [맑음때때로 여름]

스트림(stream)이란?
- 데이터를 운반(입출력)하는데 사용되는 연결통로
- 연속적인 데이터의 흐름을 물(stream)에 비유해서 붙여진 이름
- 하나의 스트림으로 입출력을 동시에 수행할 수 없다.(단방향 통신)
- 입출력을 동시에 수행하려면, 2개의 스트림이 필요하다.

 

•자바의 스트림
–입·출력 장치와 프로그램을 연결하며, 이들 사이의 데이터 흐름을 처리하는 소프트웨어 모듈
–데이터를 처리하기 위한 공통된 방법을 제공함
–입력 스트림 : 입력 장치로부터 자바 프로그램으로 전달되는 데이터의 흐름 혹은 데이터 전송 소프트웨어 모듈
–출력 스트림 : 자바 프로그램에서 출력 장치로 보내는 데이터의 흐름 또는 데이터 전송 소프트웨어 모듈

 

자바 입·출력 스트림의 특징
–스트림은 FIFO 구조
• FIFO : 먼저 들어간 것이 먼저 나오는 형태 → 데이터의 순서가 바뀌지 않음
–스트림은 단방향
• 읽기, 쓰기가 동시에 되지 않음
• 읽는 스트림과 쓰는 스트림을 하나씩 열어 사용해야 함
–스트림은 지연될 수 있음
• 스트림은 넣어진 데이터가 처리되기 전까지는 스트림에 사용되는 스레드가 지연상태에 빠짐
• 네트워크 내에서는 데이터가 모두 전송되기 전까지 네트워크 스레드는 지연상태를 유지함

•InputStream 클래스의 대표적인 두 메소드

  public abstract int read() throws IOException

  public void close() throws IOException

 

•OutputStream 클래스의 대표적인 메소드

 public abstract void write(int b) throws IOException

 public void close() throws IOException

 

자바 입·출력 스트림의 종류


–바이트 스트림


•문자 단위/바이트 단위
•바이트 스트림은 1바이트를 입·출력 할 수 있는 스트림
•자바에서 입·출력 스트림을 통해 흘러가는 데이터의 기본 단위
•일반적으로 바이트로 구성된 파일을 처리하기에 적합

 

•바이트 스트림 클래스
–JAVA . IO 패키지 포함
–InputStream/OutputStream

 >추상 클래스로써 바이트 입·출력 스트림을 다루는 모든 클래스의 슈퍼 클래스
–FileInputStream/FileOutputStream 

 >파일로 부터 바이트 단위로 읽거나 저장하는 클래스

 >바이너리 파일을 입·출력을 할 때 사용

 

 

package io;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

public class ByteFileCopy {

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

		
		// 읽어올 대상 파일의 InputStream 인스턴스를 생성한다.

			InputStream in = new FileInputStream("org.pdf");
			
		// 출력 대상 파일의 OutpurStream 인스턴스 생성
			
			OutputStream out = new FileOutputStream("org_copy.pdf");

			
		// 필터스트림 인스턴스 생성
		BufferedInputStream bin = new BufferedInputStream(in, 1024*3);
		BufferedOutputStream bout = new BufferedOutputStream(out, 1024*3);
		
		int copyByte=0; // 복사한 사이즈
		int bData=0; // 원본에서 복사한 byte 사이즈의 데이터
		
//		byte[] buf = new byte[1024]; // 1kb 버퍼생성
//		int readLength = 0; // 얼마만큼 읽어왔는지.
		
		System.out.println("복사를 시작합니다.");
		
		while(true) {
			bData = in.read(); // 더이상 가져올 데이터가 없으면 -1을 반환
//			readLength = in.read(buf);
			
			if(bData==-1) { 
//			if(readLength==-1) { 
				break;
			}
			out.write(bData); // 출력 : 파일에 바이터리 코드를 쓴다.
//			out.write(buf,0,readLength);
//			copyByte+= readLength;
			copyByte++;
		}
		
		in.close(); // 스트림 인스턴스 소멸
		out.close(); 
		System.out.println("복사가 완료되었습니다.");
		System.out.println("복사된 사이즈 : " + copyByte + "byte");
}
}

 

+ Recent posts