보조 스트림 : 다른 스트림과 연결되어 여러 가지 편리한 기능을 제공해주는 스트림을 말함
보조 스트림은 중간에 메모리 버퍼(buffer)와 작업을 함으로써 실행의 성능을 향상시킬 수 있음
예를 든다면, 프로그램은 직접 하드 디스크에 데이터를 보내지 않고
메모리 버퍼에 데이터를 보냄으로써 쓰기 속도가 향상됨
버퍼는 데이터가 쌓이기만을 기다렸다가 버퍼가 꽉 차게 되면
데이터를 한꺼번에 하드 디스크로 보내 줌으로써 출력 횟수를
줄여주게 됨
스트림의 기능(성능)을 향상시키는 클래스
Bufferedxxx : 버퍼를 제공해주는 보조 스트림 관련 클래스
버퍼(buffer) : CPU와 IO 간의 속도 차이를 보완해줌

바이트 스트림과
바이트 스트림에 보조 스트림을 이용하여 이미지를 읽어오는 속도 차이를 확인해보자!
=============================코드=============================
public static void main(String[] args) throws Exception {
// try ~ catch문 대신 throws Exception 코드 작성
// 1. 바이트 스트림 방식으로 이미지 파일을 읽어 오자
FileInputStream is = new FileInputStream("C:/test/Koala.jpg");
long start, end;
start = System.nanoTime();
while(is.read() != -1) { } // 출력만 할 것이기 때문에 반복문 안에 실행값 넣지 않음!
end = System.nanoTime();
System.out.println("바이트 스트림을 이용한 경우 >>> " + (end-start) + "ns");
is.close();
System.out.println();
// 2. 바이트 스트림에 보조 스트림을 연결하여 이미지 파일을 읽어오자
FileInputStream is1 = new FileInputStream("C:/test/Koala.jpg");
// 위가 InputStream이라면 보조 스트림도 InputStream이어야 함 (Reader라면 밑에도 Reader)
BufferedInputStream bis = new BufferedInputStream(is1); // 보조스트림에다가 바이트 스트림을 연결함
start = System.nanoTime();
while(bis.read() != -1) { } // 출력만 할 것이기 때문에 반복문 안에 실행값 넣지 않음!
end = System.nanoTime();
System.out.println("보조 스트림을 이용한 경우 >>> " + (end-start) + "ns");
bis.close(); is1.close(); // bis가 나중에 생성되었으니 먼저 닫혀야 함!
}
=============================실행=============================
보조 스트림이 훨씬 빠르다는 것을 알 수 있음!
