BufferedInputStream — 버퍼를 사용하는 입력 스트림
BufferedInputStream — 버퍼를 사용하는 입력 스트림
BufferedInputStream은 다른 입력 스트림에 버퍼링 기능을 더해주는 클래스예요. 입력을 버퍼에 저장해 두고 mark와 reset 메서드를 지원하도록 해 주죠. BufferedInputStream이 생성될 때 내부 버퍼 배열이 만들어지고, 스트림에서 바이트를 읽거나 건너뛸 때마다 내부 버퍼는 포함된 입력 스트림으로부터 여러 바이트씩 다시 채워집니다. mark 연산은 입력 스트림의 특정 지점을 기억하고, reset 연산은 가장 최근 mark 이후에 읽은 모든 바이트를 포함된 입력 스트림에서 새 바이트를 읽기 전에 다시 읽도록 해 줘요.
본문
이 클래스는 java.io.InputStream → java.io.FilterInputStream을 상속하며 Closeable, AutoCloseable을 구현합니다. 버퍼에 저장된 데이터를 관리하는 보호된 필드들을 갖고 있어요.
필드
protected volatile byte[] buf— 데이터가 저장되는 내부 버퍼 배열이에요. 필요에 따라 크기가 다른 배열로 교체될 수 있어요.protected int count— 버퍼에서 마지막 유효 바이트의 인덱스보다 1 큰 값이에요. 항상0부터buf.length사이의 값을 가지며,buf[0]부터buf[count-1]까지가 기반 스트림에서 얻은 버퍼링된 입력 데이터를 담아요.protected int pos— 버퍼의 현재 위치예요. 다음에buf배열에서 읽을 바이트의 인덱스이며, 항상0부터count사이의 값을 가져요.protected int markpos— 마지막으로mark메서드가 호출됐을 때pos필드의 값이에요. 항상-1부터pos사이이며, 표시된 위치가 없으면-1이에요.protected int marklimit—mark후reset이 실패하기 전까지 읽을 수 있는 최대 선행 바이트 수예요.pos와markpos의 차이가marklimit을 넘으면markpos를-1로 설정해 표시를 버려요.
생성자
BufferedInputStream(InputStream in)—BufferedInputStream을 만들고 인자in(기반 입력 스트림)을 저장해 두며, 내부 버퍼 배열을 생성해buf에 저장해요.BufferedInputStream(InputStream in, int size)— 지정한 버퍼 크기(size)로BufferedInputStream을 만들어요. 길이가size인 내부 버퍼 배열을 생성해 저장하며,size <= 0이면IllegalArgumentException을 던져요.
메서드
int read()— 다음 바이트를 반환하고, 스트림 끝이면-1을 반환해요.IOException을 던질 수 있어요.int read(byte[] b, int off, int len)— 주어진 오프셋부터 지정된 바이트 배열로 바이트를 읽어요. 기반 스트림의read를 반복 호출해 가능한 한 많은 바이트를 읽으려 해요.IndexOutOfBoundsException(off가 음수, len이 음수, 또는 len이b.length - off보다 큼),IOException을 던질 수 있어요.long skip(long n)—n개의 바이트를 건너뛰고 실제 건너뛴 바이트 수를 반환해요.IOException을 던질 수 있어요.int available()— 다음 호출에서 블로킹 없이 읽을(또는 건너뛸) 수 있는 바이트 수의 추정치를 반환해요. 버퍼에 남은 바이트(count - pos)와in.available()을 더한 값이에요.void mark(int readlimit)— input stream의mark규약에 따르며 마크 위치가 무효화되기 전에 읽을 수 있는 최대 바이트 제한값을 받아요.void reset()—markpos가-1이면IOException을 던지고, 그렇지 않으면pos를markpos로 설정해요.boolean markSupported()— 이 스트림이mark/reset을 지원하는지 여부를 반환하며,BufferedInputStream에서는 항상true를 반환해요.void close()— 스트림을 닫고 관련 시스템 자원을 해제해요. 닫힌 후 추가 호출은IOException을 던져요.AutoCloseable,Closeable에서 지정됐어요.
이 클래스는 mark/reset을 지원하면서 버퍼링을 제공해 파일이나 네트워크 스트림을 효율적으로 읽을 수 있게 도와줘요.