"Some text".getBytes("UTF-16BE"))): fc.closeO:
// Повторная попытка чтения:
fc = new FileInputStreamCdata2.txt").getChannelO;
buff.clearO:
fc.read(buff);
buff.flipO:
System.out.pri nt1n(buff.asCharBuffer());
// Использование CharBuffer для записи:
fc = new FileOutputSt reamCdata2.txt"). getChannelO;
buff = ByteBuffer.a11ocate(24); // Больше, чем необходимо
buff.asCharBuffer().put("Some text");
fc.write(buff);
fc.closeO;
// Чтение и вывод:
fc = new FileInputStreamCdata2.txt").getChannelO;
buff.clearO;
fc.read(buff):
buff.flipO;
System.out.pri nt1n(buff.asCha rBuffer());
}
} /* Output: ????
Декодировано в Cpl252: Some text Some text Some text *///:-
Буфер содержит обычные байты, следовательно, для превращения их в символы мы должны либо
//: io/Avai1ableCharSets.java
// Перечисление кодировок и их символических имен
import java.nio.charset.*;
import java.util.*;
import static net.mindview.util.Print.*;
public class AvailableCharSets {
public static void main(String[] args) {
SortedMap
String csName = it.nextO; printnb(csName); Iterator aliases =
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.