버퍼 없이(unbuffered I/O 방식) 입출력을 처리하면 비효율적
- 입출력 스트림은 운영체제 API를 호출하여 입출력 장치↔프로그램 데이터 전송
- API가 자주 호출되고 입출력 횟수가 늘어나므로 시스템 효율과 실행 속도 저하
>> 버퍼(buffer)를 사용해 효율적 작동 가능
버퍼
- 데이터를 일시적으로 저장하기 위한 메모리
- 파일에 쓸 데이터를 버퍼에 모아 두었다가 한 번에 운영체제 API를 호출하여 작성
- 운영체제 부담 감소, 시스템 효율 증가
버퍼 입출력
- 입출력 스트림이 버퍼를 가지고 입출력을 처리하는 방식
- 버퍼를 가지는 스트림을 버퍼 스트림(Buffered Stream)이라 함
- 버퍼 입력 스트림: 입력 장치로부터 입력된 데이터를 버퍼에 모아서 프로그램으로 전송
- 버퍼 출력 스트림: 프로그램에서 출력한 데이터를 버퍼에 모아 두었다가 한 번에 출력 장치에 출력
- 데이터 타입에 따라 바이트 버퍼 스트림과 문자 버퍼 스트림으로 구분
버퍼 스트림 생성 및 활용
바이트 버퍼 스트림 클래스 생성자

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

버퍼 출력 스트림 생성
BufferedOutputStream bout = new BufferedOutputStream(System.out, 20);
- 20바이트 크기
- 표준 출력 스트림(System.out)에 연결하여 화면에 출력하는 버퍼 스트림 생성
스트림 출력
FileReader fin = new FileReader("c:\\windows\\system.ini");
int c;
while((c=fin.read())!=-1){ //파일 끝까지 문자들을 하나씩 읽음
bout.write((char)c);
//읽은 문자를 버퍼 출력 스트림에 씀
//출력 스트림과 연결된 화면에 출력
}
- c:\windows\system.ini 파일을 읽고 버퍼 출력 스트림을 통해 화면에 출력하는 프로그램 코드
버퍼에 남아 있는 데이터 출력
- 버퍼 스트림은 버퍼가 꽉 찼을 때만 출력됨
- 버퍼가 다 차지 않은 상태에서 버퍼에 있는 데이터를 강제로 출력 장치로 보내려면 flush() 메소드 호출
bout.flush(); //bout 스트림에 있는 데이터를 모두 출력
스트림 닫기
bout.close(); //버퍼 스트림 닫기
fin.close(); //파일 입력 스트림 닫기
예제 8-7 표준 출력 스트림(System.out)과 연결한 버퍼 출력 스트림 생성
- 버퍼 크기 5
- c:\Temp\test2.txt 파일에 저장된 영문 텍스트를 읽어 버퍼 출력 스트림을 통해 출력
- test2.txt 파일

import java.io.*;
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);
//버퍼 크기가 5이므로 5개의 문자만 출력되고 3개의 문자는 버퍼에 남아 있음
}
//파일 데이터 모두 출력
new Scanner(System.in).nextLine(); //enter 키 -> out.flush() 실행
out.flush(); //버퍼에 남아 있는 문자 강제 출력
fin.close();
out.close();
}
catch(IOException e) {
e.printStackTrace();
}
}
}

버퍼 크기를 5로 설정했으므로 프로그램을 처음 실행하면 5개의 문자만 출력
Enter 키 입력 후 flush() 메소드를 호출해 버퍼에 있는 모든 데이터를 출력해야 8까지 모두 표시
'안 씀 > java-개념' 카테고리의 다른 글
파일 입출력 응용: 파일 복사 (0) | 2024.06.24 |
---|---|
File 클래스 (0) | 2024.06.23 |
바이트 스트림과 파일 입출력 (0) | 2024.06.20 |
문자 스트림과 파일 입출력 (0) | 2024.06.19 |
입출력 스트림 (0) | 2024.06.19 |