본문 바로가기

자바공부

버퍼 입출력과 파일 입출력, 명품 자바 프로그래밍 8장

728x90
반응형

* 입출력 스트림은 운영체제 API를 호출하여 입출력장치와 프로그램 사이에서 데이터가 전송되도록 한다.

운영체제 API: Application Programming Interface

파일 쓰기 메소드는 최종적으로 운영체제 API를 호출하여 파일에 쓰도록 시키고, 운영체제 API는 하드디스크에게 명령을 내려 파일에 데이터를 기록한다.

자주 운영체제 API가 호출될수록 하드 디스크 장치나 네트워크 장치가 자주 작동하게 되어 시스템의 효율은 나빠지고 프로그램 역시 여러 번 입출력을 진행해야 하므로 입출력의 실행 속도가 떨어진다.

이 단점을 보완하기 위해 스트림이 버퍼(Buffer)를 가지게 되면 보다 효율적으로 작동할 수 있다.

 

* 버퍼(Buffer)란 데이터를 일시적으로 저장하기 위한 메모리이다.

파일 출력 스트림이 파일에 쓸 데이터를 버퍼에 모아 두었다가, 한 번에 운영체제 API를 호출하여 파일에 쓰게 하면, 운영체제의 부담을 줄이고 장치를 구동하는 일이 즐어들게 되어 시스템의 속도나 효율이 올라가게 될 것이다.

 

버퍼를 가지는 버퍼 스트림

* 버퍼 입출력(Buffered I/O)이란 입출력 스트림이 버퍼를 가지고 보다 효율적으로 입출력을 처리하는 방식이다.

버퍼를 가지는 스트림을 버퍼 스트림(Buffered Stream)이라고 부른다.

버퍼 입력 스트림은 입력 장치로부터 입력된 데이터를 버퍼에 모아서 프로그램으로 보내며, 

버퍼 출력 스트림은 프로그램에서 출력한 데이터를 역시 버퍼에 모아 두었다가 한 번에 출력 장치에 출력한다.

 

* 버퍼 스트림 역시 데이터 타입에 따라 바이트 버퍼 스트림과 문자 버퍼 스트림으로 구분된다.

바이트 버퍼 스트림을 구현한 입출력 클래스 : BufferedInputStream / BufferedOutputStream

문자 버퍼 스트림을 구현한 클래스 : BufferedReader / BufferedWriter

 

* 버퍼 스트림은 내부에 버퍼를 가진다는 사실만 다를 뿐, 개발에제게 보이는 면은 입출력 스트림과 동일하다.

 

* 바이트 버퍼 스트림 클래스의 생성자

생성자 설명
BufferedInputStream(InputStream in) in을 연결하는 디폴트 크기의 입력 버퍼 스트림 객체 생성
BufferedInputStream
(InputStream in, int size)
in을 연결하는 size 크기의 입력 버퍼 스트림 객체 생성
BufferedOutputStream(OutputStream out) out을 연결하는 디폴트 크기의 출력 버퍼 스트림 생성
BufferedOutputStream
(OutputStream out, int size)
out을 연결하는 size 크기의 출력 버퍼 스트림 생성

 

* 문자 버퍼 스트림 클래스의 생성자

 

생성자 설명
BuffredReader(Reader in) in을 연결하는 디폴트 크기의 문자 입력 버퍼 스트림 생성
BufferedReader(Reader in, int sz) in을 연결하는 sz 크기의 문자 입력 버퍼 스트림 생성
BufferedWriter(Writer out) out을 연결하는 디폴트 크기의 문자 출력 버퍼 스트림 생성
BufferedWriter(Writer out, int sz) out을 연결하는 sz 크기의 문자 출력 버퍼 스트림 생성

* 파일을 읽고 버퍼 출력 스트림을 통해 화면에 출력하는 과정

파일을 읽고 버퍼 출력 스트림을 통해 화면에 출력하는 과정

 

* 버퍼 스트림을 이용한 출력

package Ch0807Ex;
import java.io.*;
import java.util.Scanner;
public class Ch0807Ex {
	public static void main(String[] args) {
		FileReader fin = null;
		int c;
		try {
			fin = new FileReader("c:\\Temp\\test2.txt");
			BufferedOutputStream out = new BufferedOutputStream(System.out, 5);
			// BuffrerOutputStream는 바이트 단위로 출력하므로, ANSI코드의 영문만 출력할 수 있다.
			// 한글까지 출력하기 위해서는
			// BufferedWriter out = new BufferedWriter(new OutputStreamWriter(System.out), 5);
			// 와 같이 수정하면 된다.
			while((c=fin.read())!=-1) {	// 파일 데이터를 모두 스크린에 출력
				out.write(c);
			}
			// 파일 데이터가 모두 출려된 상태
			new Scanner(System.in).nextLine(); 	// <Enter> 키 입력
			out.flush(); // 버퍼에 남아 있던 문자 모두 출력
			fin.close();
			out.close();
		}catch(IOException e) {
			e.printStackTrace();
		}
	}
}
반응형