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

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

Жанры

Философия Java3

Эккель Брюс

Шрифт:

ByteBuffer bb = ByteBuffer allocate(BSIZE). // При выделении буфер заполняется нулями int i = 0;

while(i++ < bb limitO)

if(bb.get != 0)

print("nonzero");

printC'i = " + i); bb rewindO:

// Сохраняем и считываем символьный массив bb asCharBufferO put("Howdy!"); char c,

while((c = bb.getCharO) != 0) printnb(c + " ");

printO. bb rewindO:

// Сохраняем и считываем число типа short: bb.asShortBuffer.put((short >471142): print(bb.getShortO), bb. rewindO;

// Сохраняем

и считываем число типа int: bb.asIntBufferO put(99471142): print(bb getlntO), bb. rewindO,

// Сохраняем и считываем число типа long-bb.asLongBufferO put(99471142): print(bb.getLongO); bb. rewindO,

// Сохраняем и считываем число типа float. bb.asFloatBufferO put(99471142): print(bb getFloatO); bb. rewindO.

// Сохраняем и считываем число типа double: bb asDoubleBufferO put(99471142): print(bb getDoubleO). bb. rewindO;

}

} /* Output-i = 1025 Howdy ! 12390 99471142 99471142 9 9471144E7

9.9471142E7 *///.-

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

Простейший способ вставить примитив в ByteBuffer основан на получении подходящего «представления» этого буфера методами asCharBuffer, asShort-Buffer и т. п., и последующем занесении в это представление значения методом put. В примере мы так поступаем для каждого из простейших типов. Единственным исключением из этого ряда является использование буфера ShortBuffer, требующего приведения типов (которое усекает и изменяет результирующее значение). Все остальные представления не нуждаются в преобразовании типов.

Представления буферов

«Представления буферов» дают вам возможность взглянуть на соответствующий байтовый буфер «через призму» некоторого примитивного типа. Байтовый буфер все так же хранит действительные данные и одновременно поддерживает представление, поэтому все изменения, которые вы сделаете в представлении, отразятся на содержимом байтового буфера. Как было показано в предыдущем' примере, это удобно для вставки значений примитивов в байтовый буфер. Представления также позволяют читать значения примитивов из буфера, по одному (раз он «байтовый» буфер) или пакетами (в массивы). Следующий пример манипулирует целыми числами (int) в буфере ByteBuffer с помощью класса IntBuffer:

//• io/IntBufferDemo java // Работа с целыми числами в буфере ByteBuffer // посредством буфера IntBuffer import java nio *,

public class IntBufferDemo {

private static final int BSIZE = 1024, public static void main(String[] args) {

ByteBuffer bb = ByteBuffer.allocate(BSIZE); IntBuffer ib = bb.asIntBufferO; // Сохранение массива int:

ib put(new int[]{ 11, 42, 47, 99, 143, 811. 1016 }), // Чтение и

запись по абсолютным позициям: System out.println(ib.get(3)), ib put(3, 1811):

// Назначение нового предела перед смещением буфера ib flipO.

whi 1 е(ib hasRemainingO) { int i = ib.getO; System.out.printin(i),

}

}

} /* Output 99 11 42 47

143 811 1016 *///:-

Перегруженный метод put первый раз вызывается для помещения в буфер массива целых чисел int. Последующие вызовы put и get обращаются к конкретному числу int из байтового буфера ByteBuffer. Заметьте, что такие обращения к простейшим типам по абсолютной позиции также можно осуществить напрямую через буфер ByteBuffer.

Как только байтовый буфер ByteBuffer будет заполнен целыми числами или другими примитивами через представление, его можно передать для непосредственной записи в канал. Настолько же просто считать данные из канала и использовать представление для преобразования данных к конкретному простейшему типу. Вот пример, который трактует одну и ту же последовательность байтов как числа short, int, float, long и double, создавая для одного байтового буфера ByteBuffer различные представления:

//: io/ViewBuffers.java import java.nio.*;

import static net.mindview.util.Print.*;

public class ViewBuffers {

public static void main(String[] args) { ByteBuffer bb = ByteBuffer.wrap(

new byte[]{ 0. 0. 0. 0. 0. 0. 0. 'a' }); bb.rewind; printnb("Буфер Byte "); while(bb.hasRemainingO)

printnb(bb.position+ " -> " + bb.getO + \ ");

printO; CharBuffer cb -

((ByteBuffer)bb.rewind).asCharBuffer; printnb("Буфер Char "); while(cb.hasRemainingO)

printnb(cb.position + " -> " + cb.getO + \ ");

printO;

FloatBuffer fb -

((ByteBuffer)bb.rewi nd).asFloatBuffer; printnb("Буфер Float "); while(fb.hasRemainingO)

printnb(fb.position+ " -> " + fb.getO + ");

printO; IntBuffer ib -

((ByteBuffer)bb.rewind).asIntBuffer; printnb("Буфер Int "); while(ib.hasRemainingO)

printnb(ib.position+ " -> " + ib.getO + ". ");

printO; LongBuffer lb =

((ByteBuffer)bb.rewind).asLongBuffer; printnbCБуфер Long "); while(lb.hasRemainingO)

printnb(1b.position+ " -> " + Ib.getO + ". ");

printO;

ShortBuffer sb =

((ByteBuffer)bb.rewind).asShortBuffer, pri ntnbCБуфер Short "), while(sb hasRemainingO)

printnb(sb position+ " -> " + sb.getO + ");

printO,

DoubleBuffer db =

((ByteBuffer)bb.rewi nd) asDoubleBuffer: printnb("Буфер Double "), while(db hasRemainingO)

printnb(db position+ " -> " + db getO + ", ");

}

} /* Output

Буфер Byte 0 -> 0. 1 -> 0, 2 -> 0. 3 -> 0. 4 -> 0, 5 -> 0. 6 -> 0. 7 -> 97,

Поделиться:
Популярные книги

Морской волк. 1-я Трилогия

Савин Владислав
1. Морской волк
Фантастика:
альтернативная история
8.71
рейтинг книги
Морской волк. 1-я Трилогия

Изменяющий-Механик. Компиляция. Книги 1-18

Усманов Хайдарали
Собрание сочинений
Фантастика:
боевая фантастика
космическая фантастика
5.00
рейтинг книги
Изменяющий-Механик. Компиляция. Книги 1-18

Кодекс Крови. Книга IХ

Борзых М.
9. РОС: Кодекс Крови
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Кодекс Крови. Книга IХ

Государь

Кулаков Алексей Иванович
3. Рюрикова кровь
Фантастика:
мистика
альтернативная история
историческое фэнтези
6.25
рейтинг книги
Государь

Отход

Видум Инди
4. Петя и Валерон
Фантастика:
рпг
аниме
попаданцы
5.00
рейтинг книги
Отход

Эволюционер из трущоб. Том 6

Панарин Антон
6. Эволюционер из трущоб
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Эволюционер из трущоб. Том 6

Вечный. Книга IV

Рокотов Алексей
4. Вечный
Фантастика:
боевая фантастика
попаданцы
рпг
5.00
рейтинг книги
Вечный. Книга IV

Камень. Книга восьмая

Минин Станислав
8. Камень
Фантастика:
фэнтези
боевая фантастика
7.00
рейтинг книги
Камень. Книга восьмая

Кодекс Охотника. Книга XVIII

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

Третий. Том 3

INDIGO
Вселенная EVE Online
Фантастика:
боевая фантастика
космическая фантастика
попаданцы
5.00
рейтинг книги
Третий. Том 3

Мистика

Гейман Нил
Детективы:
классические детективы
исторические детективы
7.29
рейтинг книги
Мистика

Родословная. Том 5

Ткачев Андрей Юрьевич
5. Линия крови
Фантастика:
городское фэнтези
аниме
фэнтези
5.00
рейтинг книги
Родословная. Том 5

Кодекс Охотника. Книга XXXVI

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

Дважды одаренный. Том V

Тарс Элиан
5. Дважды одаренный
Фантастика:
аниме
альтернативная история
городское фэнтези
5.00
рейтинг книги
Дважды одаренный. Том V