Философия Java3
Шрифт:
приравнивает к нулю. Метод используется для подготовки буфера к чтению,
после того как в него были записаны данные
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
I posi
lim
Позиция (pos) указывает на первый элемент буфера, вместительность (cap) и предельное значение (lim) — на последний.
В методе symmetricScramble цикл while выполняется до тех пор, пока позиция не станет равной предельному значению. Позиция буфера изменяется при вызове для него «относительных» методов put или get. Можно также использовать «абсолютные» версии методов put
и get, которым передается ар-гумент-индекс, указывающий, с какого места начнет работу метод put или метод get. Эти методы не изменяют значение позиции буфера.Когда управление переходит в цикл 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
к
к
k
к
lim
pos |
Для смешивания символов нам нужно записать символ с2 в позицию 0, a cl в позицию 1. Для этого можно обратиться за .«абсолютной» версией метода put, но мы приравняем позицию метке, что и делает метод resetQ:
| mar
1
г
1
г
и
S
i
п
g
в
U
f
f
е
г
S
к
к
)
к
з
cap |
>
г
1
г
и
S
i
п
g
в
U
f
f
е
г
S
i
к
k
к
Rim
На следующей итерации значение метки приравнивается позиции:
mar