Чтение онлайн

на главную - закладки

Жанры

Философия Java3

Эккель Брюс

Шрифт:

}

FileChannel

in = new FileInputStream(args[0]) getChannel. out = new FileOutputStream(args[l]) getChannelО; in.transferTo(0, in.sizeO. out); // Или-

// out transferFrom(in, 0. in.sizeO),

}

} ///;-

Часто такую операцию выполнять вам не придется, но знать о ней полезно.

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

Если вы вспомните программу 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 Fi1eOutputStream("data2.txt").getChannel; fc write (ByteBuffer. wrap ("Some text" .getBytesO)); fc closeO;

fc = new FileInputStream("data2.txt").getChannelО; ByteBuffer buff = ByteBuffer allocate(BSIZE); fc read(buff); buff .flipO; // He работает-

System out prmtln(buff.asCharBufferO); продолжение &

// Декодирование с использованием кодировки по умолчанию: buff.rewindO;

String encoding = System.getProperty("file.encoding"); System.out.println("Декодировано в " + encoding + ": "

+ Charset.forName(encoding).decode(buff)); // Кодирование в печатной форме: fc = new Fi1e0utputStreamCdata2.txt").getChannel О; fc.wri te(ByteBuffer.wrap(

"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<String.Charset> charSets = Charset.avai1ableCharsets; Iterator<String> 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) {

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

Том 4. Повести и рассказы, статьи 1844-1854

Тургенев Иван Сергеевич
4. Собрание сочинений в двенадцати томах
Проза:
русская классическая проза
5.00
рейтинг книги
Том 4. Повести и рассказы, статьи 1844-1854

Вечный. Книга VI

Рокотов Алексей
6. Вечный
Фантастика:
рпг
фэнтези
5.00
рейтинг книги
Вечный. Книга VI

Дьявольская колония

Роллинс Джеймс
7. Отряд «Сигма»
Детективы:
триллеры
8.96
рейтинг книги
Дьявольская колония

Медная шкатулка (сборник)

Рубина Дина Ильинична
Проза:
современная проза
7.50
рейтинг книги
Медная шкатулка (сборник)

Барбаросса

Пикуль Валентин Саввич
Проза:
историческая проза
8.88
рейтинг книги
Барбаросса

Неучтенный элемент. Том 8

NikL
8. Антимаг. Вне системы
Фантастика:
фэнтези
5.00
рейтинг книги
Неучтенный элемент. Том 8

Мир в подарок. Трилогия

Демченко Оксана Б.
124. В одном томе
Фантастика:
фэнтези
8.87
рейтинг книги
Мир в подарок. Трилогия

Библия. Синодальный перевод

Священное Писание
Религия и эзотерика:
религия
5.00
рейтинг книги
Библия. Синодальный перевод

Кортни. 1-13

Смит Уилбур
Кортни
Приключения:
исторические приключения
прочие приключения
5.00
рейтинг книги
Кортни. 1-13

Дюна. Батлерианский джихад

Андерсон Кевин Джей
1. Легенды Дюны
Фантастика:
научная фантастика
7.29
рейтинг книги
Дюна. Батлерианский джихад

Ответная операция. В погоне за Призраком

Ардаматский Василий Иванович
11. Библиотека приключений
Проза:
военная проза
5.00
рейтинг книги
Ответная операция. В погоне за Призраком

Пушкарь. Пенталогия

Корчевский Юрий Григорьевич
Фантастика:
альтернативная история
8.11
рейтинг книги
Пушкарь. Пенталогия

Ник. Цикл

Ясинский Анджей
Ник
Фантастика:
фэнтези
попаданцы
5.00
рейтинг книги
Ник. Цикл

Королевская кровь - 2

Котова Ирина Владимировна
Фантастика:
героическая фантастика
5.60
рейтинг книги
Королевская кровь - 2