Читаем Философия Java3 полностью

"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 *///:-

Буфер содержит обычные байты, следовательно, для превращения их в символы мы должны либо кодировать их по мере помещения в буфер, либо декодировать их при извлечении из буфера. Это можно сделать с помощью класса java.nio.charset.Charset, который предоставляет инструменты для преобразования многих различных типов в наборы символов:

//: 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 charSets = Charset.avai1ableCharsets(); Iterator it = charSets.keySetО.iteratorO: whileCit.hasNextO) {

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.

Перейти на страницу:

Похожие книги

1С: Бухгалтерия 8 с нуля
1С: Бухгалтерия 8 с нуля

Книга содержит полное описание приемов и методов работы с программой 1С:Бухгалтерия 8. Рассматривается автоматизация всех основных участков бухгалтерии: учет наличных и безналичных денежных средств, основных средств и НМА, прихода и расхода товарно-материальных ценностей, зарплаты, производства. Описано, как вводить исходные данные, заполнять справочники и каталоги, работать с первичными документами, проводить их по учету, формировать разнообразные отчеты, выводить данные на печать, настраивать программу и использовать ее сервисные функции. Каждый урок содержит подробное описание рассматриваемой темы с детальным разбором и иллюстрированием всех этапов.Для широкого круга пользователей.

Алексей Анатольевич Гладкий

Программирование, программы, базы данных / Программное обеспечение / Бухучет и аудит / Финансы и бизнес / Книги по IT / Словари и Энциклопедии
1С: Управление торговлей 8.2
1С: Управление торговлей 8.2

Современные торговые предприятия предлагают своим клиентам широчайший ассортимент товаров, который исчисляется тысячами и десятками тысяч наименований. Причем многие позиции могут реализовываться на разных условиях: предоплата, отсрочка платежи, скидка, наценка, объем партии, и т.д. Клиенты зачастую делятся на категории – VIP-клиент, обычный клиент, постоянный клиент, мелкооптовый клиент, и т.д. Товарные позиции могут комплектоваться и разукомплектовываться, многие товары подлежат обязательной сертификации и гигиеническим исследованиям, некондиционные позиции необходимо списывать, на складах периодически должна проводиться инвентаризация, каждая компания должна иметь свою маркетинговую политику и т.д., вообщем – современное торговое предприятие представляет живой организм, находящийся в постоянном движении.Очевидно, что вся эта кипучая деятельность требует автоматизации. Для решения этой задачи существуют специальные программные средства, и в этой книге мы познакомим вам с самым популярным продуктом, предназначенным для автоматизации деятельности торгового предприятия – «1С Управление торговлей», которое реализовано на новейшей технологической платформе версии 1С 8.2.

Алексей Анатольевич Гладкий

Финансы / Программирование, программы, базы данных