· Буферизированные (Buffered)
· Канальные (Piped…)
Специализированные потоковые классы и интерфейсы для ввода-вывода значений простых типов данных и строк. DataInputStream (DataOutputStream) реализует интерфейс DataInput (DataOutput), в котором объявлены методы потокового ввода-вывода данных простых типов (readInt, writeBoolean, …) Классы-интерфейсы для платформенно-независимой обработки данных. File… Классы-интерфейсы, поддерживающие механизм сериализации. Позволяют преобразовывать объект в байтовый поток и восстанавливать его из данных потока. ObjectInputStream, ObjectOutputStream.Фильтрованные потоки
Позволяют применять к данным, которые вводятся или выводятся с помощью других потоков, операции фильтрации. Классы-фильтры позволяют надстраивать потоки, то есть строить цепочки потоков и получать составные потоки с расширенными возможностями. Надстройка объектов, т. е. наложение дополнительных объектов для получения новых свойств. Необходимо, чтобы все объекты имели одинаковый интерфейс, т. е. набор методов доступа к объекту.
Интерфейс для надстроек в системе ввода-вывода в Java представляют классы семейства Filter. Это абстрактные классы, производные от основных классов ввода-вывода. Основное требование к классам-надстройкам – наследование от этих классов.
Фильтрованный поток привязывается к другому потоку, который и выполняет операции ввода-вывода.
Не все Filter-классы изменяют данные. Некоторые просто обеспечивают дополнительные особенности поведения, например, буферизированные потоки. Другие расширяют интерфейсы взаимодействия потоков, например, Print.
Доступ к фильтрованным потокам осуществляется с помощью методов, использующих порождающий поток, связанный с суперклассом фильтрованных потоков. Фильтрованные потоки могут объединяться в цепочки, образуя единый сложный фильтр.
class MyFilter extends FilterReader {
public MyFilter (Reader in) { super(in); }
public int read() throws IOException {……… super. read();…………..}
}
class FilterDemo {
StringReader src = new StringReader (args[0]);
FilterReader f = new MyFilter (src);
………. f. read()………
}
Буферизированные потоки
Buffered. Классы-надстройки. Не выполняют никаких изменений данных потока. буфер – область в памяти. Буферизация позволяет избежать обращения к источнику или приемнику данных при выполнении каждого read или write. рекомендуется использовать совместно с потоками File. Буферизация позволяет уменьшить число обращений к оперативной памяти и ускорить работу.
Принципы работы с буферизированными потоками:
Входные потоки (ввода и чтения). Используется метод read. Если буфер пуст, то вызывается read основного потока источника, буфер максимально заполняется, и данные извлекаются из буфера. Выходные потоки. Когда write до предела заполняет буфер, вызывается write основного потока приемника, буфер освобождается. Несколько write в буфер = 1 write в приемник. flush – сброс потока. Вызывает write и записывает все в приемник.new BufferedOutputStream (new FileOutputStream (path));
Канальные потоки
классы piped позволяют связать входные и выходные потоки и получить потоки-каналы. Канальные потоки – пары поток чтения-поток записи или поток ввода-поток вывода. данные, переданные в выходной поток, являются источником для входного потока. С каналом связан общий внутренний буфер. Его емкость определяется при реализации класса. Динамически изменять размер буфера нельзя. Каналы реализуют механизм обмена данными между потоками вычислений. При этом безопасный способ работы с данными подразумевает использование двух потоков вычислений – один для вывода в выходной поток, другой для ввода из входного потока.
PipedWriter out = new PipedWriter();
PipedReader in = new PipedReader(out);
Синхронизация потоков данных
Классы байтовых и символьных потоков придерживаются политики синхронизации. Ее можно описать следующим образом:
Байтовые потоки. Эти классы обеспечивают синхронизацию при осуществлении операций read, write, которые не должны прерываться со стороны других потоков вычислений. Это позволяет нескольким потокам вычислений использовать один поток данных. Т. о., при записи в один поток данных со стороны двух потоков вычислений, байты от двух потоков не будут перемешиваться. Символьные потоки. Выполняют синхронизацию proteted-поля lock, в котором храниться ссылка на объект потока. В классах Reader и writer предусмотрен конструктор, который получает в качестве параметра объект, который будет присвоен полю lock. В объектах некоторых классов это поле – не this. Например, если StringWriter осуществляет запись в объект StringBuffer (lock ссылается на объект StringBuffer).28. Технология компонентного программирования JavaBeans: основные понятия; ключевые технологии
Появилась в начале 1997 года, в JDK 1.1. Это самое значительное усовершенствование в JDK 1.1. В составе ядра Java API появился пакет java. beans.
Компонент – часть программы, которая изолирована в отдельном элементе с целью повторного использования. Они могут быть написаны и откомпилированы независимо друг от друга, а затем использованы при построении сложного приложения. Могут быть невидимыми. Создание приложения сводится к блочной сборке в среде визуального проектирования.
Этапы создания приложения:
Компиляция компонентов – небольших функциональных порций кода. Компонент выполняет определенную задачу и может иметь множество вариантов настройки. Каждый компонент создается автономно. Разработка. Компоненты загружаются в визуальную среду – компоновщик. Создание приложения. Как правило, компоновщик генерирует файл с исходным кодом, который описывает расположение и взаимодействие компонентов. Код можно редактировать вручную. Затем код компилируется. Выполнение.Компонентная модель
Представляет из себя архитектуру API и набор соглашений по присвоению имен ПО. Компоненты могу быть связаны между собой контейнерами. Современные компонентные модели поддерживают большинство из следующих фундаментальных сервисов:
1. Настройку компонента при помощи редактра свойств визуальной среды.
2. Интроспекцию, то есть анализ компонента с целью предоставления разработчику информации о свойствах, методах, событиях компонента.
3. Устойчивость, то есть способность сохранять и восстанавливать настроенные и связанные компоненты.
4. Обработку событий, которая обеспечивает взаимодействие компонентов.
5. Упаковку компонента с целью упрощения поставки и установки компонента.
6. Распределенную обработку данных, то есть способность к взаимодействию компонентов, размещенных на разных компьютерах сети.
Технология Java Beans, появившаяся в 1997 году, реализует все эти возможности компонентной модели. Для настройки компонентов можно использовать такое программное обеспечение, как Bean Developer Kit или JDeveloper. Интроспекция осуществляется с помощью механизма рефлексии (отражения), которая обеспечивается пакетом java. lang. reflect и классом java. lang. Class. Устойчивость реализуется с помощью механизма сериализации, то есть преобразования объекта в последовательность байтов с учетом его состояния. Обработка событий обеспечивается моделью делегирования событий. При упаковке классы и ресурсы компонента помещаются в архив JAR, который является разновидностью zip-архива. Распределенная обработка данных поддерживается технологией Remote Method Invocation и пакетом .
29. Технология компонентного программирования JavaBeans: основные требования к классам Bean-компонентов; соглашения об именах; связанные и ограниченные свойства компонентов
Соглашения об именах
Требования:
Способность к инициализации нового экземпляра класса. Нельзя создавать на основе интерфейса или абстрактного класса. Конструктор без параметров. Возможность сериализации. Использование модели делегирования событий. Совместимость со стандартами проектирования. 2 способа: соглашение об именах и использование BeanInfo.Компонент имеет свойства, которые определяют его состояние. Свойство – именуемый атрибут, идентифицируемый в результате интроспекции. Свойства: простые, логические, индексируемые.
Простые. Переменные простого и ссылочного типа. Методы:
public type getPropertyName();
public void setPropertyName(type value);
Логические. Тип данных boolean. Те же методы +
public type isPropertyName();
Индексированные. В виде массивов.
public type getPropertyName(int index);
public void setPropertyName(int index, type value);
или
public type[] getPropertyName();
public void setPropertyName(type[] values);
Не все среды разработки поддерживают индексированные свойства.
Соглашения об именах для событий:
public void addTypeListener (Type Listener l) // для регистрации блока прослушивания событий
public void removeTypeListener (Type Listener l) // для удаления блока прослушивания событий
При наличии этих методов компоновщик предполагает, что компонент может генерировать событие TypeEvent.
Соглашения об именах для методов:
public-методы доступны компоновщику, остальные скрываются.
Связанные свойства
Bound Properties. При изменении связанного свойства компонент генерирует событие изменения свойства PropertyChangeEvent. Событие может быть передано другому компоненту и обработано. В пакете java. beans есть классы и интерфейсы, которые поддерживают связанные свойства.
Класс PropertyChangeEvent (унаследован от java. util. EventObject à не AWT-событие). Объект содержит информацию о старом и новом значении свойства и ссылку на объект-источник. Событие формируется, когда свойство изменилось. Оно посылается компонентам, которые зарегистрировали интерес в нем.
Интерфейс PropertyChangeListener. Имеет метод
public void propertyChange (PropertyChangeEvent e)
Класс PropertyChangeSupport. Помогает управлять списками блоков прослушивания и уведомлять их о событиях изменения свойства. Методы:
public void addPropertyChangeListener (PropertyChangeListener l)
public void removePropertyChangeListener (PropertyChangeListener l)
public void firePropertyChangeListener (String name, Object oldValue, Object newValue) – запуск события изменения связанного свойства.
|
Из за большого объема этот материал размещен на нескольких страницах:
1 2 3 4 5 |


