본문 바로가기
안 씀/java-개념

버퍼 입출력과 파일 입출력

by unhyepnhj 2024. 6. 23.

버퍼 없이(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