Структура буферных данных Java

Структура буферных данных JavaПри использовании подхода с отображением в память создается один единственный буфер, охватывающий либо весь файл целиком, либо только интересующую в нем область. Однако буферы еще также могут применяться для считывания и записи и более скромных фрагментов информации.

В нашей сегодняшней статьи дается описание основных операций, которые могут выполняться с объектами Buffer. Буфером, в общем, называется массив значений одинаково типа. Класс Buffer представляет собой абстрактный класс с такими конкретными подклассами, как ByteBuffer, DoubleBuffer, FloatBuffer, IntBuffer, LongBuffer и ShortBuffer.

Класс StringBuffer к этим подклассам никакого отношения не имеет.

На практике чаще всего применяется класс ByteBuffer и CharBuffer. Как показано на рис.1, каждый буфер обладает:

  • емкостью, которая никогда не изменяется;
  • позицией, начиная с которой считывается или записывается следующее значение;
  • пределом, после которого выполнять считывание или запись не имеет смысла;
  • необязательно, отметкой для повторения операции считывании или записи.

Все эти значение удовлетворяют следующему условию:

0 <= отметка <= позиция <= предел <= емкость

Буфер работает главным образом по циклу «сначала запись, потом чтение». Изначально позиция буфера соответствует нулю(0), а предел — емкости. Для добавления значений в буфер нужно вызывать метод put. Исчерпав подлежащие добавлению в буфер данные, или заполнив всю его емкость, можно переходить к чтению.

Структура буферных данных JavaДля этого потребуется вызвать метод flip, чтобы значение предела стало соответствовать текущей позиции, а позиция — нулю. Далее можно вызывать метод get до тех пор, пока метод remaining(возвращающий разницу между значением предела и позиции) будет возвращать положительные значения. Считав все значения в буфере, нужно вызвать метод clear, чтобы подготовить буфер к следующему циклу записи.

Метод clear возвращает позицию в нулевое положение и снова приравнивает значение предела к значению емкости.

При желании выполнить повторное считывание данных в буфере, нужно применять такие методы, как rewind или mark/reset, способы вызова которых подробно описываются в API.