Философия Java3
вернуться

Эккель Брюс

Шрифт:

charSets get(csName) .aliasesO .iteratorO; if(aliases.hasNextO)

pnntnbC': "); while(aliases hasNextO) {

printnb(aliases.nextO); if(aliases. hasNextO) printnbC'. "),

}

printO;

}

}

} /* Output: Big5. csBig5

Big5-HKSCS: big5-hkscs, big5hk, big5-hkscs:unicode3 0. big5hkscs. Big5_HKSCS

EUC-JP eucjis, x-eucjp, csEUCPkdFmtJapanese, eucjp,

Extended_UNIX_Code_Packed_Format_for_Japanese. x-euc-jp, euc_jp

EUC-KR: ksc5601, 5601, ksc5601_1987, ksc_5601, ksc5601-

1987, euc_kr, ks_c_5601-1987, euckr, csEUCKR

GB18030• gbl8030-2000

GB2312: gb2312-1980, gb2312, EUC_CN, gb2312-80, euc-cn,

euccn, x-EUC-CN

GBK. windows-936, CP936

*///;-

Вернемся к программе BufferToText.java. Если вы вызовете для буфера метод rewind (чтобы вернуться к его началу), а затем используете кодировку по умолчанию в методе decode, данные буфера CharBuffer будут правильно выведены на консоль. Чтобы узнать кодировку по умолчанию вызовите метод System. getProperty("fiLe.encoding"), который возвращает строку с названием кодировки. Передавая эту строку методу Charset.forName, вы получите объект Charset, с помощью которого и декодируете строку.

Другой подход — кодировать данные методом encode так, чтобы при чтении файла выводились данные, пригодные для вывода на печать (пример представлен в программе BufferToText.java). Здесь для записи текста в файл используется кодировка UTF-16BE, и при последующем чтении вам остается лишь преобразовать данные в буфер CharBuffer и вывести его содержимое.

Наконец, мы видим, что происходит, когда вы записываете в буфер ByteBuffer через CharBuffer (мы узнаем об этом чуть позже). Заметьте, что для байтового буфера выделяется 24 байта. На каждый символ (char) отводится два байта, соответственно, буфер вместит 12 символов, а у нас в строке Some Text их только девять. Оставшиеся нулевые байты все равно отображаются в строке, образуемой методом toStringO класса CharBuffer, что и показывают результаты.

Извлечение примитивов

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

//. io/GetData java

11 Получение различных данных из буфера ByteBuffer import java nio *.

import static net.mindview util Print *;

public class GetData {

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

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:

  • Читать дальше
  • 1
  • ...
  • 203
  • 204
  • 205
  • 206
  • 207
  • 208
  • 209
  • 210
  • 211
  • 212
  • 213
  • ...

Private-Bookers - русскоязычная библиотека для чтения онлайн. Здесь удобно открывать книги с телефона и ПК, возвращаться к сохраненной странице и держать любимые произведения под рукой. Материалы добавляются пользователями; если считаете, что ваши права нарушены, воспользуйтесь формой обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • help@private-bookers.win

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