Чтение онлайн

на главную - закладки

Жанры

Философия Java3

Эккель Брюс

Шрифт:

newEncoder newDecoder

decode(ByteBuffer) if

В кодированный поток байт

Отметьте, что перемещать данные каналов («из» и «в») допустимо только с помощью байтовых буферов ByteBuffer, а для остальных простейших типов можно либо создать отдельный буфер этого типа, либо получить такой буфер из байтового буфера посредством метода с префиксом as. Таким образом, буфер

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

Подробно о буфере

Буфер (Buffer) состоит из данных и четырех индексов, используемых для доступа к данным и эффективного манипулирования ими. К этим индексам относятся метка (mark), позиция (position), предельное значение (limit) и вместимость (capacity). Есть методы, предназначенные для установки и сброса значений этих индексов, также можно узнать их значение (табл. 16.7).

Таблица 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

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. Черный маг императора
Фантастика:
юмористическая фантастика
попаданцы
аниме
5.00
рейтинг книги
Черный маг императора

Печать мастера

Лисина Александра
6. Гибрид
Фантастика:
попаданцы
технофэнтези
аниме
фэнтези
6.00
рейтинг книги
Печать мастера

Я Гордый часть 2

Машуков Тимур
2. Стальные яйца
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Я Гордый часть 2

Я до сих пор не царь. Книга XXVII

Дрейк Сириус
27. Дорогой барон!
Фантастика:
юмористическое фэнтези
аниме
попаданцы
5.00
рейтинг книги
Я до сих пор не царь. Книга XXVII

Петля, Кадетский Корпус. Книга четвертая

Алексеев Евгений Артемович
4. Петля
Фантастика:
боевая фантастика
попаданцы
аниме
5.00
рейтинг книги
Петля, Кадетский Корпус. Книга четвертая

Кодекс Охотника XXXI

Винокуров Юрий
31. Кодекс Охотника
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Кодекс Охотника XXXI

Император Пограничья 10

Астахов Евгений Евгеньевич
10. Император Пограничья
Фантастика:
городское фэнтези
аниме
фантастика: прочее
попаданцы
5.00
рейтинг книги
Император Пограничья 10

Звездная Кровь. Изгой

Елисеев Алексей Станиславович
1. Звездная Кровь. Изгой
Фантастика:
боевая фантастика
попаданцы
рпг
5.00
рейтинг книги
Звездная Кровь. Изгой

Погранец

Поселягин Владимир Геннадьевич
2. Решала
Фантастика:
фэнтези
боевая фантастика
альтернативная история
5.00
рейтинг книги
Погранец

Вторая жизнь майора. Цикл

Сухинин Владимир Александрович
Вторая жизнь майора
Фантастика:
героическая фантастика
боевая фантастика
попаданцы
5.00
рейтинг книги
Вторая жизнь майора. Цикл

Третий. Том 2

INDIGO
2. Отпуск
Фантастика:
космическая фантастика
попаданцы
5.00
рейтинг книги
Третий. Том 2

Двойник Короля 10

Скабер Артемий
10. Двойник Короля
Фантастика:
аниме
фэнтези
фантастика: прочее
попаданцы
5.00
рейтинг книги
Двойник Короля 10

Газлайтер. Том 10

Володин Григорий
10. История Телепата
Фантастика:
боевая фантастика
5.00
рейтинг книги
Газлайтер. Том 10

Стеллар. Трибут

Прокофьев Роман Юрьевич
2. Стеллар
Фантастика:
боевая фантастика
рпг
8.75
рейтинг книги
Стеллар. Трибут