Отметьте, что перемещать данные каналов («из» и «в») допустимо только с помощью байтовых буферов ByteBuffer, а для остальных простейших типов можно либо создать отдельный буфер этого типа, либо получить такой буфер из байтового буфера посредством метода с префиксом as. Таким образом, буфер
с примитивными данными
Подробно о буфере
Буфер (Buffer) состоит из данных и четырех индексов, используемых для доступа к данным и эффективного манипулирования ими. К этим индексам относятся
Таблица 16.7. Методы буфера
Метод
Описание
capacity()
Возвращает значение емкости буфера
clear()
Очищает буфер, устанавливает позицию в нуль, а предельное значение
делает равным вместимости. Этот метод можно вызывать для перезаписи
существующего буфера
flip()
Устанавливает предельное значение равным позиции, а позицию
приравнивает к нулю. Метод используется для подготовки буфера к чтению,
после того как в него были записаны данные
limit()
Возвращает предельное значение
limit(int lim)
Устанавливает предельное значение
mark()
Приравнивает метке значение позиции
position()
Возвращает значение позиции
position(int pos)
Устанавливает значение позиции
remaining()
Возвращает разницу между предельным значением и позицией
hasRemainingO
Возвращает true, если между позицией и предельным значением еще
остались элементы
Методы, вставляющие данные в буфер и считывающие их оттуда, обновляют эти индексы в соответствии с внесенными изменениями.
Следующий пример использует очень простой алгоритм (перестановка смежных символов) для смешивания и восстановления символов в буфере CharBuffer:
//: io/UsingBuffers.java
import java.nio.*;
import static net.mindview.util.Print.*;
public class UsingBuffers {
private static void symmetricScramble(CharBuffer buffer){ while(buffer.hasRemainingO) { buffer.markO; char cl = buffer.getО; char c2 = buffer.getО; buffer. resetO; buffer.put(c2).put(cl);
}
}
public static void main(String[] args) {
char[] data = "UsingBuffers" .toCharArrayO;
ByteBuffer bb = ByteBuffer.allocate(data.length * 2);
CharBuffer cb - bb.asCharBuffer();
cb.put(data):
print(cb. rewindO);
symmetricScramble(cb);
print(cb. rewindO);
symmetricScramble(cb);
print(cb. rewindO);
}
} /* Output; UsingBuffers sUniBgfuefsr UsingBuffers *///:-
Хотя получить буфер CharBuffer можно и напрямую, вызвав для символьного массива метод wrap(), здесь сначала выделяется служащий основой байтовый буфер ByteBuffer, а символьный буфер CharBuffer создается как представление байтового. Это подчеркивает, что в конечном счете все манипуляции производятся с байтовым буфером, поскольку именно он взаимодействует с каналом. На входе в метод symmetricScrambleQ буфер выглядит следующим образом:
cap I
>
и
s
i
п
g
в
и
f
f
е
г
s
J
к
I posi
lim
В методе symmetricScramble() цикл while выполняется до тех пор, пока
Когда управление переходит в цикл while, вызывается метод mark() для установки значения
QJoS]
| пгаг I
I cap 1
и
S
i
п
g
в
и
f
f
е
г
s
lim
Два вызова «относительных» методов get() сохраняют значение первых двух символов в переменных cl и с2. После этих вызовов буфер выглядит так:
mar
ГроЛ
Два вызова метода put() записывают с2, а затем cl:
I Pos I
cap]
>
1
г
и
S
i
п
g
в
U
f
f
е
г
S
к
к
lim
pos |