Примечание: В этом разделе, говоря о содержимом, мы сознательно будем избегать слова файл. Механизм содержимого среды выполнения не считает, что содержимое хранится в файлах файловой системы. Однако он поддерживает протокол, позволяющий связывать типы содержимого с шаблонами именования файлов. На практике эти имена представляют файлы в файловой системе, но в реализации системы содержимого ничего не говорится о нахождении содержимого в файловой системе. Файловые типы содержимого, добавленные модулем ресурсов платформы, обсуждаются в разделе Кодировка файлов и типы содержимого. Рекомендуется к прочтению разработчикам, использующим API типов содержимого в этом контексте
Типы содержимого представляет класс IContentType. Этот интерфейс представляет собой уникальный тип содержимого, с помощью которого можно прочесть поток данных и интерпретировать сведения о типе его содержимого. По своей природе типы содержимого иерархичны. Например, тип для данных XML считается дочерним для текстового типа. Такая природа позволяет новым типам содержимого использовать атрибуты или поведение более общих типов.
IContentTypeManager - входная точка, дающая доступ к большей части API платформы, связанного с поддержкой типов содержимого. Для получения ссылки на IContentTypeManager можно использовать API Platform:
IContentTypeManager contentTypeManager = Platform.getContentTypeManager();
IContentTypeManager предоставляет несколько методов для работы с системой типов содержимого.
Определить типа содержимого для данного потока данных можно с помощью IContentTypeManager, например:
InputStream stream = ...; IContentType contentType = contentTypeManager.findContentTypeFor(stream, "file.xml"); stream.close();
Это вернет наиболее подходящий объект IContentType или null
если такого не будет найдено. При этом одинаково подходящими могут оказаться и несколько типов. В этом случае будет применен эвристический анализ. Первый критерий - имя файла. Если оно не указано, результат может быть менее точным, т.к. достаточно большое количество несвязанных между собой типов могут принимать одинаковые данные; это также повлияет на производительность, т.к. поток данных будет проанализирован всеми типами содержимого. Поэтому, если имя файла доступно, его следует передавать при вызове метода findContentTypeFor.
Система типов содержимого предоставляет возможность описания содержимого двоичного или текстового потока. Ниже приведен фрагмент кода для получения описания:
InputStream stream = ...; IContentDescription description = contentTypeManager.getDescriptionFor(stream, "file.xml"); stream.close();
Возвращаемый экземпляр IContentDescription описывает тип содержимого и дополнительную информацию, полученную из содержимого. Эти свойства хранятся в форме пар ключ-значение. Такие свойства, как набор символов и порядок байтов текстовых потоков, описываются самой платформой, а остальные определяются источниками типов содержимого.
Новые типы содержимого задаются как потомки существующих. Поэтому можно говорить, что тип, стоящий ниже по иерархии, есть базовый. Это нужно учитывать при работе с типами содержимого. Если функция применима к данному типу, то она должна работать и с его производными типами. Метод IContentType.isKindOf(IContentType superType) определяет отношение двух объектов IContentType. Метод IContentType.getBaseType() определяет базовый тип данного.