Spec-Zone .ru
спецификации, руководства, описания, API
Содержание документации

<Содержание

Глава 13: Введение в Интерфейсы Поставщика услуг

 

Отметить

Для версии 5.0, новых конструкторов для AudioFormat, AudioFileFormat, и MidiFileFormat позвольте описание более усовершенствованных форматов.


Каковы Службы?

Службы являются модулями обрабатывающей звук функциональности, которые автоматически доступны, когда прикладная программа использует реализацию API Звука Java. Они состоят из объектов, которые делают работу чтения, записи, смешивания, обработки, и преобразования данные MIDI и аудио. Реализация API Звука Java обычно предоставляет основной набор служб, но механизмы также включаются в API, чтобы поддерживать разработку новых звуковых служб сторонними разработчиками (или поставщиком реализации непосредственно). Эти новые службы могут быть "включены в" существующую установленную реализацию, чтобы развернуть ее функциональность, не требуя нового выпуска. В архитектуре API Звука Java сторонние службы интегрируются в систему таким способом, которым интерфейс прикладной программы им является тем же самым как интерфейсом к "встроенным" службам. В некоторых случаях, разработчики приложений, которые используют javax.sound.sampled и javax.sound.midi пакеты не могли бы даже знать, что используют сторонние службы.

Примеры стороннего потенциала, службы выбранного аудио включают:

Сторонние службы MIDI могли бы состоять из:

Как Работают Службы

javax.sound.sampled и javax.sound.midi пакеты предоставляют функциональность разработчикам приложений, которые хотят включать звуковые службы в их прикладные программы. Эти пакеты для потребителей звуковых служб, обеспечивая интерфейсы, чтобы получить информацию о, управление, и аудио доступа и службы MIDI. Кроме того, API Звука Java также предоставляет два пакета, которые определяют абстрактные классы, которые будут использоваться провайдерами звуковых служб: javax.sound.sampled.spi и javax.sound.midi.spi пакеты.

Разработчики новых звуковых служб реализуют конкретные подклассы соответствующих классов в пакетах SPI. Эти подклассы, наряду с любыми дополнительными классами, требуемыми поддерживать новую службу, помещаются в Архив JavaTM (JAR) архивный файл с описанием включенной службы или служб. Когда этот файл JAR устанавливается в пользователе CLASSPATH, система времени выполнения автоматически делает новую службу доступной, расширяя функциональность системы времени выполнения платформы JavaTM.

Как только новая служба устанавливается, к ней можно получить доступ точно так же как любой ранее установленная служба. Потребители служб могут получить информацию о новой службе, или получить экземпляры нового класса службы непосредственно, вызывая методы AudioSystem и MidiSystem классы (в javax.sound.sampled и javax.sound.midi пакеты, соответственно), чтобы возвратить информацию о новых службах, или возвратить экземпляры новых или существующих классов службы непосредственно. Прикладные программы нуждаются не — и не должен — ссылаться на классы в пакетах SPI (и их подклассы) непосредственно, чтобы использовать установленные службы.

Например, предположите, что гипотетический поставщик услуг под названием Acme Software, Inc. интересуется предоставлением пакета, который позволяет прикладным программам читать новый формат звукового файла (но тот, аудиоданные которого находятся в стандартном формате данных). Класс SPI AudioFileReader может быть разделен на подклассы в класс, вызванный, скажем, AcmeAudioFileReader. В новом подклассе Высшая точка предоставила бы реализации всех методов, определенных в AudioFileReader; в этом случае есть только два метода (с разновидностями параметра), getAudioFileFormat и getAudioInputStream. Затем, когда прикладная программа, предпринятая, чтобы считать звуковой файл, который, оказалось, был в формате файла Высшей точки, он вызовет методы AudioSystem класс в javax.sound.sampled получить доступ к файлу и информации об этом. Методы AudioSystem.getAudioInputStream и AudioSystem.getAudioFileFormat обеспечьте стандартный API, чтобы считать аудиопотоки; с AcmeAudioFileReader установленный класс, этот интерфейс расширяется, чтобы поддерживать новый тип файла прозрачно. Разработчики приложений не нуждаются в прямом доступе к недавно зарегистрированным классам SPI: AudioSystem объектные методы передают запрос на установленный AcmeAudioFileReader класс.

Какой смысл того, чтобы иметь эти классы "фабрики"? Почему бы не разрешать разработчику приложений получать доступ непосредственно к недавно предоставленным услугам? Это - возможный подход, но имеющий все управление и инстанцирование служб проходят через экраны системных объектов привратника разработчик приложений от необходимости знать что-либо об идентификационных данных установленных служб. Разработчики приложений только используют службы имеющие значение для них, возможно даже не понимая это. Одновременно эта архитектура разрешает поставщикам услуг эффективно управлять доступными ресурсами в своих пакетах.

Часто использование новых звуковых служб прозрачно к прикладной программе. Например, вообразите ситуацию, где разработчик приложений хочет читать в потоке аудио от файла. Принятие этого thePathName идентифицирует файл звукового входа, программа делает это:

    File theInFile = new File(thePathName);
    AudioInputStream theInStream = AudioSystem.getAudioInputStream(theInFile); 
Негласно, AudioSystem определяет, какая установленная служба может считать файл и просит, чтобы это предоставило аудиоданные как AudioInputStream объект. Разработчик не мог бы знать или даже заботиться, что входной аудиофайл находится в некотором новом формате файла (таком как Высшая точка), поддерживается установленными сторонними службами. Первый контакт программы с потоком через AudioSystem объект, и весь его последующий доступ к потоку и его свойства через методы AudioInputStream. Оба из них являются стандартными объектами в javax.sound.sampled API; специальная обработка, которой может потребовать новый формат файла, полностью скрывается.

Как Провайдеры Готовят Новые Службы

Поставщики услуг предоставляют свои новые службы в особенно отформатированных файлах JAR, которые должны быть установлены в каталоге на системе пользователя, где Среда выполнения Java найдет их. Файлы JAR являются архивными файлами, каждый содержащий наборы файлов, которые могли бы быть организованы в иерархических структурах каталога в пределах архива. Детали о подготовке файлов класса, которые входят в эти архивы, обсуждаются в Главах 14 и 15, которые описывают специфические особенности аудио и пакетов SPI MIDI; здесь мы только дадим краткий обзор процесса создания файла JAR.

Файл JAR для новой службы или служб должен содержать файл класса для каждой службы, поддерживаемой в файле JAR. После соглашения платформы Java у каждого файла класса есть имя недавно определенного класса, который является конкретным подклассом одного из классов провайдера реферативной службы. Файл JAR также должен включать любые классы поддержки, требуемые новой реализацией службы. Так, чтобы новая служба или службы могли быть расположены временем выполнения механизм поставщика услуг системы, файл JAR должен также содержать специальные файлы (описанный ниже), которые отображают имена классов SPI на новые определяемые подклассы.

Чтобы продолжать от нашего примера выше, скажите, что Acme Software, Inc. распределяет пакет новых служб выбранного аудио. Давайте предположим, что этот пакет состоит из двух новых служб:

Запуск с произвольного каталога — позволяет нам вызывать это /devel— где мы хотим сделать сборку, мы создаем подкаталоги и помещаем новые файлы класса в них, организованный таким способом как, чтобы дать требуемый путь, которым сошлются на новые классы:
    com/acme/AcmeAudioFileReader.class
    com/acme/AcmeAudioFileWriter.class
Кроме того, для каждого нового разделяемого на подклассы класса SPI, мы создаем отображающийся файл в особенно именованном каталоге META-INF/services. Имя файла является именем класса SPI, разделяемого на подклассы, и файл содержит имена новых подклассов того абстрактного класса SPI.

Мы создаем файл

META-INF/services/javax.sound.sampled.spi.AudioFileReader, который состоит из

    # Providers of sound file-reading services 
    # (a comment line begins with a pound sign)
    com.acme.AcmeAudioFileReader

и также файл

META-INF/services/javax.sound.sampled.spi.AudioFileWriter, который состоит из

   # Providers of sound file-writing services 
    com.acme.AcmeAudioFileWriter

Теперь мы работаем jar из любого каталога с командной строкой:

jar cvf acme.jar -C /devel .
-C причины опции jar переключаться на /devel каталог, вместо того, чтобы использовать каталог, в котором выполняется команда. Заключительный параметр периода сообщает jar заархивировать все содержание того каталога (а именно, /devel), но не каталог непосредственно.

Это выполнение создаст файл acme.jar с содержанием:

com/acme/AcmeAudioFileReader.class
com/acme/AcmeAudioFileWriter.class
META-INF/services/javax.sound.sampled.spi.AudioFileReader
META-INF/services/javax.sound.sampled.spi.AudioFileWriter
META-INF/Manifest.mf
Файл Manifest.mf, который сгенерирован jar утилита непосредственно, список всех файлов, содержавшихся в архиве.

Как Пользователи Устанавливают Новые Службы

Для конечных пользователей (или системные администраторы), кто хочет получить доступ к новой службе через их прикладные программы, установка проста. Они помещают обеспеченный файл JAR в каталог в их CLASSPATH. После выполнения Среда выполнения Java найдет классы, на которые ссылаются, при необходимости.

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

 


Oracle и/или его филиалы Авторское право © 1993, 2011, Oracle и/или его филиалы. Все права защищены.
Свяжитесь с Нами