Эккель Брюс
Шрифт:
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: