Из Javadoc BufferedInputStream:
BufferedInputStream добавляет функциональность к другому входному потоку, а именно, возможность буферизовать ввод и поддерживать методы меток и сброса. При создании BufferedInputStream создается внутренний буферный массив. Поскольку байты из потока считываются или пропускаются, внутренний буфер пополняется по мере необходимости из содержащегося входного потока, много байтов за раз. Операция пометки запоминает точку во входном потоке, а операция сброса вызывает считывание всех байтов, поскольку самая последняя операция пометки перечитывается до того, как новые байты извлекаются из содержащегося входного потока.
Внутри используется буферный массив, и вместо чтения байтов индивидуально из базового входного потока читается достаточно байтов для заполнения буфера. Как правило, это приводит к более высокой производительности, так как для базового входного потока требуется меньше операций чтения.
Тогда для BufferedOutputStream верно обратное.
mark () и reset () можно использовать следующим образом:
1 BufferedInputStream bis = new BufferedInputStream(is);
2 byte[] b = new byte[4];
3 bis.read(b); // read 4 bytes into b
4 bis.mark(10); // mark the stream at the current position - we can read 10 bytes before the mark point becomes invalid
5 bis.read(b); // read another 4 bytes into b
6 bis.reset(); // resets the position in the stream back to when mark was called
7 bis.read(b); // re-read the same 4 bytes as line 5 into b
Чтобы объяснить пометку / сбросить еще ...
BufferInputStream внутренне запоминает текущую позицию в буфере. По мере чтения байтов позиция будет увеличиваться. Вызов на отметку (10) сохранит текущую позицию. Последующие вызовы для чтения будут продолжать увеличивать текущую позицию, но вызов для сброса вернет текущую позицию к ее значению при вызове метки.
Аргумент для метки указывает, сколько байтов вы можете прочитать после вызова метки до того, как позиция метки станет недействительной. После того, как позиция метки признана недействительной, вы больше не можете вызвать сброс, чтобы вернуться к ней.
Например, если mark (2) был использован в строке 4 выше, IOException выдается, когда reset () вызывается в строке 6, поскольку позиция метки была бы недействительной, так как мы прочитали более 2 байтов.