프로그래밍 언어/JAVA

버퍼 입출력과 파일 입출력

· 코딩마이데이

버퍼 입출력의 필요성

스트림이 버퍼(buffer)를 가지게 되면 보다 효율적으로 작동할 수 있습니다. 버퍼란 데이터를 일시적으로 저장하기 위한 메모리입니다. 파일 출력 스트림이 파일에 쓸 데이터를 버퍼를 모아 두었다가, 한 번에 운영체제 API를 호출하여 파일에 쓰게 하면, 운영체제의 부담을 줄이고 장치를 구동하는 일이 줄어들게 되어 시스템의 속도나 효율이 올라가게 될것입니다.

버퍼 스트림 역시 데이터의 타입에 따라 바이트 버퍼 스트림과 문자 버퍼 스트림으로 구분됩니다. 바이트 버퍼 스트림을 구현한 입출력 클래스는 BufferedInputStream과 BufferOurputStream이 있으며, 문자 버퍼 스트림을 구현한 클래스는 BufferedReader와 BufferedWriter가 있습니다.

 

버퍼 스트림 생성 및 활용

버퍼 스트림은 내부에 버퍼를 가진다는 사실만 다를 뿐이지 개발자에게 보이는 많은 입출력 스트림과 동일합니다.

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

 

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

 

버퍼 출력 스트림 생성

BufferedOutputStream 클래스로 화면에 출력하는 버퍼 출력 스트림을 생성해봅니다.

BufferedOutputStream bout = new BufferedOutputStream(System.out, 20); // 20바이트 버퍼

 

스트림 출력

FileReader fin = new FileReader("C:\\windows\\system.ini");
int c;
while ((c = fin.read()) != -1) { // 파일 끝을 만날 때까지 문자들을 하나씩 읽는다.
	bout.write((char)c); // 읽은 문자를 버퍼 출력 스트림에 쓴다. 출력 스트림과 연결된 화면에 출력됩니다.
}

 

버퍼에 남아 있는 데이터 출력

버퍼 스트림은 버퍼를 가지고 있디 때문에 버퍼가 꽉 찼을 때만 출력되는 특징이 있습니다. 그러므로 프로그램에서 데이터를 출력하였지만 버퍼에 들어 있어 출력 장치에 보이지 않을 수 있습니다. 버퍼가 다 차지 않는 상태에서 버퍼에 있는 데이터를 강제출력 장치로 보내려면, 다음과 같이 flush() 메서드를 호출하면 됩니다.

bout.flush(); // bout 스트림의 버퍼에 있는 데이터를 모두 장치에 출력

 

스트림 닫기

버퍼 스트림을 모두 사용하였다면 다음과 같이 닫아 주어야 합니다.

bout.close(); // 버퍼 스트림 닫기
fin.close(); // 파일 입력 스트림 닫기

 

버퍼 스트림을 이용한 출력

import java.io.BufferedOutputStream;
import java.io.FileReader;
import java.io.IOException;
import java.util.Scanner;

public class BufferedIOEx {
    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);
            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();
        }
    }
}

 

결과

12345

678