русс | укр

Языки программирования

ПаскальСиАссемблерJavaMatlabPhpHtmlJavaScriptCSSC#DelphiТурбо Пролог

Компьютерные сетиСистемное программное обеспечениеИнформационные технологииПрограммирование

Все о программировании


Linux Unix Алгоритмические языки Аналоговые и гибридные вычислительные устройства Архитектура микроконтроллеров Введение в разработку распределенных информационных систем Введение в численные методы Дискретная математика Информационное обслуживание пользователей Информация и моделирование в управлении производством Компьютерная графика Математическое и компьютерное моделирование Моделирование Нейрокомпьютеры Проектирование программ диагностики компьютерных систем и сетей Проектирование системных программ Системы счисления Теория статистики Теория оптимизации Уроки AutoCAD 3D Уроки базы данных Access Уроки Orcad Цифровые автоматы Шпаргалки по компьютеру Шпаргалки по программированию Экспертные системы Элементы теории информации

Преобразование данных


Дата добавления: 2015-06-12; просмотров: 824; Нарушение авторских прав


Если вы вспомните программу GetChannel.java, то увидите, что для вывода информации из файла нам приходилось считывать из буфера по одному байту и преобразовывать его от типа byte к типу char. Такой подход явно примитивен — если вы посмотрите на классjava.nio.CharBuffer, то увидите, что в нем есть метод toString(), который возвращает строку из символов, находящихся в данном буфере. Байтовый буфер ByteBuffer можно рассматривать как символьный буфер CharBuffer, как это делается в методе asCharBuffer(), почему бы так и не поступить? Как вы увидите уже из первого предложения expect(), это не сработает:

//: io/BufferToText.java

// Получение текста из буфера ByteBuffers и обратно

import java.nio.*;

import java.nio.channels.*;

import java.nio.charset.*;

import java.io.*;

 

public class BufferToText {

private static final int BSIZE = 1024;

public static void main(String[] args) throws Exception {

FileChannel fc =

new FileOutputStream("data2.txt").getChannel();

fc.write(ByteBuffer.wrap("Some text".getBytes()));

fc.close();

fc = new FileInputStream("data2.txt").getChannel();



ByteBuffer buff = ByteBuffer.allocate(BSIZE);

fc.read(buff);

buff.flip();

// Doesn't work:

System.out.println(buff.asCharBuffer());

// Decode using this system's default Charset:

buff.rewind();

String encoding = System.getProperty("file.encoding");

System.out.println("Decoded using " + encoding + ": "

+ Charset.forName(encoding).decode(buff));

// Or, we could encode with something that will print:

fc = new FileOutputStream("data2.txt").getChannel();

fc.write(ByteBuffer.wrap(

"Some text".getBytes("UTF-16BE")));

fc.close();

// Now try reading again:

fc = new FileInputStream("data2.txt").getChannel();



buff.clear();

fc.read(buff);

buff.flip();

System.out.println(buff.asCharBuffer());

// Use a CharBuffer to write through:

fc = new FileOutputStream("data2.txt").getChannel();

buff = ByteBuffer.allocate(24); // More than needed

buff.asCharBuffer().put("Some text");

fc.write(buff);

fc.close();

// Read and display:

fc = new FileInputStream("data2.txt").getChannel();



buff.clear();

fc.read(buff);

buff.flip();

System.out.println(buff.asCharBuffer());

}

}

<spoiler text="Output:">

????

Decoded using Cp1252: Some text

Some text

Some text

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

//: io/AvailableCharSets.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,Charset> charSets =

Charset.availableCharsets();

Iterator<String> it = charSets.keySet().iterator();

while(it.hasNext()) {

String csName = it.next();

printnb(csName);

Iterator aliases =

charSets.get(csName).aliases().iterator();

if(aliases.hasNext())

printnb(": ");

while(aliases.hasNext()) {

printnb(aliases.next());

if(aliases.hasNext())

printnb(", ");

}

print();

}

}

}

<spoiler text="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: gb18030-2000

GB2312: gb2312-1980, gb2312, EUC_CN, gb2312-80, euc-cn, euccn, x-EUC-CN

GBK: windows-936, CP936

</spoiler> Вернемся к программе 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 их только девять. Оставшиеся нулевые байты все равно отображаются в строке, образуемой методом toString() классаCharBuffer, что и показывают результаты.

 



<== предыдущая лекция | следующая лекция ==>
FileChannel | Извлечение примитивов


Карта сайта Карта сайта укр


Уроки php mysql Программирование

Онлайн система счисления Калькулятор онлайн обычный Инженерный калькулятор онлайн Замена русских букв на английские для вебмастеров Замена русских букв на английские

Аппаратное и программное обеспечение Графика и компьютерная сфера Интегрированная геоинформационная система Интернет Компьютер Комплектующие компьютера Лекции Методы и средства измерений неэлектрических величин Обслуживание компьютерных и периферийных устройств Операционные системы Параллельное программирование Проектирование электронных средств Периферийные устройства Полезные ресурсы для программистов Программы для программистов Статьи для программистов Cтруктура и организация данных


 


Не нашли то, что искали? Google вам в помощь!

 
 

© life-prog.ru При использовании материалов прямая ссылка на сайт обязательна.

Генерация страницы за: 0.041 сек.