Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
56_Java.pdf
Скачиваний:
210
Добавлен:
18.02.2016
Размер:
2.39 Mб
Скачать

Скачано с сайта http://ivc.clan.su

(вызов метода fireVetoableChange()) до реального изменения его значения и выполнять эти действия в блоке try.

Метод vetoableChange(PropertyChangeEvent pce) блока прослушивания может выбросить исключение PropertyVetoException в случае, если предложенное изменение следует отменить.

Блок catch set-метода перехватывает исключение и обрабатывает его. Если исключения не было, после вызова метода fireVetoableChange() выполняется оператор изменения свойства.

Пример:

private VetoableChangeSupport vcs = new VetoableChangeSupport (this); private int x;

public void addVetoableChangeListener (VetoableChangeListener vcl)

{

vcs.addVetoableChangeListener (vcl);

}

public void removeVetoableChangeListener (VetoableChangeListener vcl)

{

vcs.removeVetoableChangeListener (vcl);

}

public setX(int X)

{

try

{

vcs.fireVetoableChange ("x", new Integer(x), new Integer(X)); x = X;

}catch (PropertyVetoException e) {

//изменение было запрещено

}

}

...

public void vetoableChange (PropertyChangeEvent pee) throws PropertyVetoException

{

//проверяет, имеет ли свойство имя X

if ( ! (pce.getPropertyName().eguals("X"))) return;

try

{

Integer X = (Integer) pce.getNewValue(); int x = X.intValue();

if (x< 0 j i x > 50)

throw new PropertyVetoException("Значение свойства "Х" должно быть в диапазоне от 0 до 50", рcе);

}catch (ClassCastExeption e) {

//измененное свойство не имело тип Integer

Ввод-вывод в Java: основные понятия

1.Система ввода-вывода Java поддерживается пакетом java.io — библиотекой ядра API.

2.Базовым понятием ввода-вывода в Java является понятие потока данных stream (не путать с

потоком команд thread!).

40

Скачано с сайта http://ivc.clan.su

3. Поток данных — это абстрактное представление упорядоченной последовательности данных, которой соответствует либо источник, либо приёмник данных.

Библиотечные классы потоков позволяют не вникать в особенности низкоуровневой организации операционных систем. Потоки скрывают детали процессов, которые происходят в реальных устройствах ввода-вывода и одинаково работают с различными устройствами (консоль, файл на диске, сетевое соединение). Поток связывается с физическим устройством с помощью Java I/O System (системой ввода-вывода Java).

4.Две разновидности потоков данных:

байтовые потоки;

символьные потоки.

Символьные потоки используются в операциях текстового ввода-вывода. Под символьными потоками понимается последовательности 16-битовых Unicode-символов.

Байтовые потоки используются в операциях бинарного ввода-вывода, т.е. в операциях с информацией, представленной

вдвоичном виде.

5.Приняты следующие наименования потоков, отражающие принадлежность потоков к той или иной разновидности и направление передачи данных.

Байтовые потоки:

потоки ввода (input streams);

 

потоки вывода (output streams).

Символьные потоки:

потоки чтения (readers);

 

потоки записи (writers).

Входные потоки — это потоки ввода и потоки чтения. Выходные потоки — это потоки вывода и потоки записи.

Почти для каждого потока ввода существует поток вывода. Для большинства потоков ввода и вывода определены функционально сходные потоки чтения и записи (см. иерархии типов потоков на рис.).

Замечания:

1.Классы символьных потоков появились в JDK 1.1. Кроме того, в JDK 1.1 были исключены некоторые классы и методы байтовых потоков и добавлены новые. В JDK 1.2 (Java 2) в API ввода-вывода уже не появилось ничего принципиально нового.

2.Основной причиной появления иерархии классов Reader и Writer стала интернационализация, т.е. необходимость использования национальных алфавитов на основе Unicode-символов.

3.Классы Reader и Writer не заменяют классы байтовых потоков InputStream и OutputStream. Классы байтовых потоков представляют полезные возможности для реализации байт-ориентированного ввода-вывода. Классы символьных потоков обеспечивают удобные и эффективные средства для Unicode-ориентированного ввода-вывода.

41

Скачано с сайта http://ivc.clan.su

Рис. 1. Дерево иерархии типов байтовых потоков, определенных в пакете java.io

Рис. 2. Дерево иерархии типов символьных потоков, определенных в пакете java.io

42

Скачано с сайта http://ivc.clan.su

Основные группы классов и интерфейсов пакета java.io

1. Классы общего назначения, служащие для построения различных типов байтовых и символьных потоков: InputStream, OutputStream, Reader, Writer.

Наиболее важные методы: read(), write().

2. Классы, определяющие разновидности как байтовых, так и символьных потоков.

Например:

фильтрованные потоки (Filter)

Классы Filter представляют потоки, позволяющие применять к данным, вводимым или выводимым с помощью другого потока, операции фильтрации (некоторой обработки). Фильтрованные потоки могут объединяться в цепочки, образуя сложные единые фильтры.

буферизированные потоки (Buffered).

Класс Buffered представляет потоки, которые позволяют избежать непосредственного обращения к файлам при выполнении каждой операции чтения или записи read или write.

канальные потоки (Piped).

Классы Piped позволяют связывать входные и выходные потоки и получать канальные потоки. Канальные потоки используются в виде пар ввода-вывода и чтения-записи. Данные, переданные в выходной поток, служат источником для входного. Каналы реализуют механизм обмена данными между потоками команд (потоками типа thread): один поток осуществляет вывод данных в канал, другой — ввод из канала.

3.Специализированные потоковые классы и интерфейсы для вывода значений простых типов и строк: DatalnputStream и DataOutputStream.

4.Классы и интерфейсы для платформно-независимой обработки файловых данных: потоковые классы FilelnputStream, FileOutputStream, FileReader, FileWriter и другие классы.

5.Классы и интерфейсы, поддерживающие механизм сериализации, который позволяет преобразовывать объект в байтовый поток и при необходимости восстанавливать из данных потока:

Serializable, Externalizable, ObjectOutputStream, ObjectlnputStream.

Фильтрованные потоки

Классы Filter представляют потоки, позволяющие применять к данным, вводимым (читаемым) или выводимым (записываемым) с помощью другого потока, операции фильтрации (в широком смысле — обработки данных).

Классы семейства фильтрованных потоков позволяют надстраивать потоки, т.е. строить цепочки потоков и получать составные потоки, которые обладают расширенными функциональными возможностями. Объединяясь в цепочки, фильтрованные потоки образуют сложный единый фильтр.

Надстройка объекта — это наложение дополнительных объектов для получения новых свойств и функциональных возможностей.

Надстройка требует, чтобы все объекты, совмещаемые с исходным объектом, имели одинаковый интерфейс (набор методов доступа к объекту).

В системе ввода-вывода Java интерфейс для надстроек предоставляют классы семейства Filter, производные от основных суперклассов пакета java.io. Наследование от классов Filter — основное требование к классу-надстройке.

Фильтрованный поток данных привязывается к другому потоку, которому передает полномочия по фактическому выполнению операций ввода или вывода. Доступ к фильтрованным потокам осуществляется с помощью методов, использующих исходный (порождающий) поток, который связан с суперклассом фильтрованных потоков (см. пример FilterDemo.java)

Входные фильтрованные потоки разрешается связывать в цепочку, причем источником исходных данных может быть поток, не относящийся к семейству Filter.

Выходные фильтрованные потоки также могут соединяться в цепочки. Данные, выводимые (записываемые) в один поток, будут отфильтрованы (обработаны) и переданы следующему потоку. Последним в цепочке может быть объект любого выходного потокового класса.

43

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]