package CHAPTER13;

import java.io.BufferedInputStream; // 버퍼를 이용한 파일 입력을 위한 BufferedInputStream 클래스 가져오기
import java.io.BufferedOutputStream; // 버퍼를 이용한 파일 출력을 위한 BufferedOutputStream 클래스 가져오기
import java.io.FileInputStream; // 파일 입력을 위한 FileInputStream 클래스 가져오기
import java.io.FileOutputStream; // 파일 출력을 위한 FileOutputStream 클래스 가져오기
import java.io.IOException; // 입출력 예외 처리를 위한 IOException 가져오기

public class BufferedByteStreamExample { // 버퍼 기반 바이트 스트림 예제 클래스
    public static void main(String[] args) {
        // try-with-resources 문을 사용하여 자동으로 스트림을 닫음
        try (BufferedInputStream bis = new BufferedInputStream(new FileInputStream("input.bin")); // "input.bin" 파일을 읽기 위한 버퍼 입력 스트림 생성
             BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("output.bin"))) { // "output.bin" 파일을 쓰기 위한 버퍼 출력 스트림 생성

            byte[] buffer = new byte[1024]; // 1KB 크기의 버퍼 생성
            int bytesRead; // 읽은 바이트 수 저장 변수
            while ((bytesRead = bis.read(buffer)) != -1) { // 버퍼 크기만큼 데이터를 읽고, 파일 끝(-1)이 아닐 때까지 반복
                bos.write(buffer, 0, bytesRead); // 읽은 데이터만큼 파일에 기록
            }

            System.out.println("파일이 복사되었습니다."); // 파일 복사 완료 메시지 출력
        } catch (IOException e) { // 입출력 예외 발생 시 처리
            e.printStackTrace(); // 예외 정보 출력
        }
    }
}

