При использовании подхода с отображением в память создается один единственный буфер, охватывающий либо весь файл целиком, либо только интересующую в нем область. Однако буферы еще также могут применяться для считывания и записи и более скромных фрагментов информации.
В нашей сегодняшней статьи дается описание основных операций, которые могут выполняться с объектами Buffer. Буфером, в общем, называется массив значений одинаково типа. Класс Buffer представляет собой абстрактный класс с такими конкретными подклассами, как ByteBuffer, DoubleBuffer, FloatBuffer, IntBuffer, LongBuffer и ShortBuffer.
Класс StringBuffer к этим подклассам никакого отношения не имеет.
На практике чаще всего применяется класс ByteBuffer и CharBuffer. Как показано на рис.1, каждый буфер обладает:
- емкостью, которая никогда не изменяется;
- позицией, начиная с которой считывается или записывается следующее значение;
- пределом, после которого выполнять считывание или запись не имеет смысла;
- необязательно, отметкой для повторения операции считывании или записи.
Все эти значение удовлетворяют следующему условию:
0 <= отметка <= позиция <= предел <= емкость
Буфер работает главным образом по циклу «сначала запись, потом чтение». Изначально позиция буфера соответствует нулю(0), а предел — емкости. Для добавления значений в буфер нужно вызывать метод put. Исчерпав подлежащие добавлению в буфер данные, или заполнив всю его емкость, можно переходить к чтению.
Для этого потребуется вызвать метод flip, чтобы значение предела стало соответствовать текущей позиции, а позиция — нулю. Далее можно вызывать метод get до тех пор, пока метод remaining(возвращающий разницу между значением предела и позиции) будет возвращать положительные значения. Считав все значения в буфере, нужно вызвать метод clear, чтобы подготовить буфер к следующему циклу записи.
Метод clear возвращает позицию в нулевое положение и снова приравнивает значение предела к значению емкости.
При желании выполнить повторное считывание данных в буфере, нужно применять такие методы, как rewind или mark/reset, способы вызова которых подробно описываются в API.