본문 바로가기
Java/Java

자바입출력/byte기반) 버퍼입출력스트림 (BufferedInputStream, BufferedOutputStream)

by 박채니 2022. 3. 29.
SMALL

안녕하세요, 코린이의 코딩 학습기 채니 입니다.

 

개인 포스팅용으로 내용에 오류 및 잘못된 정보가 있을 수 있습니다.


자바 입출력(java IO)

- 프로그램을 기준으로 외부로부터 데이터가 들어오는 입력(input)과 프로그램에서 외부로 나가는 출력(output)으로 구성

- 입력의 대상 : 키보드/마우스/파일/네트워크 등

- 출력의 대상 : 화면/프린터/파일/네트워크/콘솔 등

 

자바 입출력 종류

① byte 단위 입출력

  - 송수신하고자 하는 데이터를 byte 단위로 쪼개 보내고 받는 것

② char 단위 입출력

  - 텍스트 전송에 특화된 방법

 

 

입력의 최상위 추상 클래스인 InputStream을 상속해 추상 메소드를 구현한 대표적인 자식 클래스에는 FileInputStream, BufferedInputStream, DataInputStream 등이 있습니다.

자바에서 콘솔 입력을 위해 미리 객체를 생성해 제공하는 System.in도 InputStream을 구현한 클래스의 객체 입니다.

 

출력의 최상위 추상 클래스인 OutputStream을 상속해 추상 메소드를 구현한 대표적인 자식 클래스에는 FileOutputStream, BufferedOutputStream, DataOutputStream 등이 있습니다.자바에서 콘솔 출력을 위해 미리 객체를 생성해 제공하는 System.out도 PrintStream 타입의 객체 입니다.

 

InputStream 주요 메소드

int available() inputStream의 남은 바이트 수를 리턴
abstract int read() int(4byte)의 하위 1byte에 읽은 데이터를 저장해 리턴 (추상메소드)
void read(byte[] b) 읽은 데이터를 byte[] b의 0번째 위치부터 저장하며 읽은 바이트 수를 리턴
int read(byte[] b, int off, int len) len 개수만큼 읽은 데이터를 byte[] b의 off 위치부터 저장
void close() InputStream의 자원 반환

 

OutputStream 주요 메소드

void flush() 메모리 버퍼에 저장된 output stream 내보내기(실제 출력 수행)
abstract void write (int b) int(4byte)의 하위 1byte를 output 버퍼에 출력(추상 메소드)
void write(byte[] b) 매개변수로 넘겨진 byte[] b의 0번째 위치에서부터 메모리 버퍼에 출력
void write(byte[] b, int off, int len) byte[]의 off 위치에서 len개를 읽은 후 출력
void close() OutputStream의 자원 반환

BufferedInputStream/BufferedOutputStream

- 입출력 과정에서 메모리 버퍼를 사용해 속도를 향상

//객체 생성 방법 BufferedInputStream) (InputStream)
File src = new File("C:\\Workspaces\\java_workspace\\photo.jpg");
BufferedInputStream bis = new BufferedInputStream(new FileInputStream(src));

//객체 생성 방법 BufferedOutputStream) (OutputStream)
File dest = new File("files/copyheart.jpg");
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(dest));

객체 생성 방식은 각 2가지가 있습니다.

BufferedInputStream
BufferedInputStream(InputStream in) 기본값 버퍼 크기가 사용
BufferedInputStream(InputStream in, int size) size를 통해 버퍼의 크기를 직접 지정 가능
BufferedOutputStrem
BufferedOutputStream(OutputStream in) 기본값 버퍼 크기가 사용
BufferedOutputStream(OutputStream out) size를 통해 버퍼의 크기를 직접 지정 가능

 

read(byte[] b)와 BufferedIOStream을 통해 사진 가져오기

BufferedInputStream bis = null;
BufferedOutputStream bos = null;
File src = new File("C:\\Workspaces\\java_workspace\\photo.jpg");
File dest = new File("files/copyheart.jpg");
		
try {
	bis = new BufferedInputStream(new FileInputStream(src));
	bos = new BufferedOutputStream(new FileOutputStream(dest));
			
	byte[] bytes = new byte[8192]; //8kb(BufferedInputStream의 내부 버퍼 기본 크기)
	int len = 0;	//읽어온 크기
			
	while((len = bis.read(bytes)) != -1) {
		System.out.println(len);
		bos.write(bytes, 0, len); //byte[], 시작위치, 길이
	}
} catch(IOException e) {
	e.printStackTrace();
} finally {
	try {
		bis.close();	//보조스트림 반납 시 기본스트림도 반납
	} catch(IOException e) {
		e.printStackTrace();
	}
	try {
		bos.close();
	} catch(IOException e) {
		e.printStackTrace();
	}
}

@콘솔출력값
8192
8192
8192
8192
8192
8192
7192

파일 생성

copyheart.jpg

보조 스트림인 BufferedInputStream, BufferedOutputStream만을 가지고는 객체 생성이 불가하여 반드시 기본 스트림인 FileInputStream, FileOutputStream을 매개변수로 포함해야 합니다.

 

read(byte[] b)는 읽어온 크기를 반환하기 때문에 읽어온 크기만큼 출력된 것을 확인할 수 있습니다.

 

출력값을 보면 배열의 크기 8192만큼 쓰고자 하는 데이터를 메모리 버퍼에 기록하고, 

한 번씩 모아 파일을 읽고 쓴 것을 알 수 있습니다.

 

당연히 하드디스크와 메모리의 쓰기 속도는 비교 자체가 불가능할 정도로 차이가 많이 나겠죠?

LIST