Инфраструктура для определения типов содержимого для потоков данных задается в модуле среды выполнения платформы. (Обзор структуры содержимого см. в разделе Типы содержимого.) Важная часть системы типов содержимого - это возможность задавать для различных видов содержимого различные кодировки (наборы символов). API ресурсов позволяет устанавливать для проектов, папок и файлов кодировки по умолчанию. Эти кодировки по умолчанию проверяются, если в содержимом самого файла кодировка не определена.
В разделе Типы содержимого говорилось, что для типов содержимого можно установить кодировки по умолчанию. С помощью API ресурсов можно достичь более тонкого управления.
Протокол для выбора кодировки по умолчанию для конкретного проекта или папки определяется в интерфейсе IContainer. Он дает больше свободы для модулей (и в итоге для пользователей) в определении подходящей кодировки для группы файлов, если стандартная кодировка не подходит.
Класс IFile определяет API для указания кодировки по умолчанию для конкретного файла. Эта кодировка будет использоваться, когда в содержимом файла кодировка не задана. Кодировка по умолчанию для файла имеет приоритет по сравнению со кодировкой по умолчанию, заданной для папки, проекта или типа содержимого этого файла.
Обе эти функции доступны конечному пользователю на страницах свойств ресурса.
Класс IFile также предоставляет API для запроса кодировки файла. Булевский флаг указывает, какую кодировку для файла следует вернуть: только явно заданную или неявную. Например:
String charset = myFile.getCharset(false);
вернет пустое значение, если в myFile нет явно заданной кодировки. Однако,
String charset = myFile.getCharset(true);
вначале проверит, не задана ли кодировка в файле неявно. Если нет, то содержимое файла будет проверяться на наличие описания кодировки. Если и его нет, то дальше произойдет поиск стандартной кодировки для папок и проектов, содержащих этот файл. Если и она не найдена, то будет проверяться кодировка по умолчанию для типа содержимого. И наконец, если и она не задана, то будет применяться стандартная кодировка для платформы. Метод getCharset() работает точно так же, как и getCharset(true).
Ресурс IFile предоставляет API для получения описания содержимого:
IFile file = ...; IContentDescription description = file.getDescription();
Этот API должен использоваться даже если нужно только определить тип содержимого - его с легкостью можно извлечь из описания. Определить тип содержимого и описания файлов рабочей области можно также путем анализа содержимого и имен файлов, и используя API, описанный в разделе Применение типов содержимого, но этот метод не рекомендуется. При определении типа содержимого с помощью IFile.getContentDescription() учитываются классификаторы проекта и параметры, относящиеся к проекту, а при непосредственном обращении к администратору типов содержимого - нет. Кроме того, т.к. чтение содержимого файлов с диска занимает много времени, модуль ресурсов кэширует описания файлов рабочей области. Благодаря этому описания содержимого могут быть получены гораздо быстрей непосредственного определения типа файла.