使用内容类型

注意:在以下讨论中,当谈到内容时,我们特地避免使用文件这个词。运行时内容引擎不会假定内容包含在文件系统的文件中。但是,它确实包括允许内容类型与文件命名模式相关联的协议。实际上,这些文件名表示文件系统中的文件,但是内容系统实现中的任何对象都不会假定内容在文件系统中。文件编码和内容类型讨论了由平台资源插件添加的面向文件的内容类型功能,这是有意在该上下文中使用内容类型 API 的开发者的必读内容。

了解内容类型

内容类型由 IContentType 表示。这个接口表示一种独特的内容类型,它知道如何读取数据流并解释特定于内容类型的信息。在本质上,内容类型是分层的。例如,XML 数据的内容类型被认为是文本内容类型的子代。这使新的内容类型能够利用更常见的内容类型的属性或行为。

IContentTypeManager 是一个入口点,它提供了对平台运行时提供的大部分与内容类型相关的 API 的访问。要获取对平台 IContentTypeManager 的引用,客户机可以使用 Platform API:

IContentTypeManager contentTypeManager = Platform.getContentTypeManager();

客户机可以使用平台 IContentTypeManager 来了解有关系统中的内容类型的信息。

检测数据流的内容类型

给定一个字节流,可以通过调用 IContentTypeManager API 来确定其内容类型,如下所示:

InputStream stream = ...;
IContentType contentType = contentTypeManager.findContentTypeFor(stream, "file.xml");
stream.close();

如果提供了输入,此 API 将返回最适合的 IContentType,如果找不到任何输入的话,就会返回 null。可能会有多种内容类型被认为适合于给定的数据流。在那种情况下,平台通过一些推断来确定应该选择哪种内容类型。文件名是选择内容类型的首要条件。可以省略文件名,但这会带来两个问题:由于会有许多不相关的内容类型接受同一输入,所以结果可能不正确;由于平台中的所有内容类型都有机会分析该数据流,所以还会对性能产生很大的影响。因此,除非没有文件名,否则客户机始终应该随数据流一起提供文件名。

描述数据流

平台中内容类型支持的另一项有吸引力的功能是能够描述二进制或字符流的内容。以下代码段显示了如何执行该操作:

InputStream stream = ...;
IContentDescription description = contentTypeManager.getDescriptionFor(stream, "file.xml");
stream.close();

返回的 IContentDescription 实例描述了从提供的内容中抽取的内容类型和其它相关信息。内容描述以键/值对形式存储特定于内容的属性。平台本身能够描述诸如字符集和基于文本的流的字节顺序之类属性,但其它属性可以由内容类型提供者定义。

提供内容敏感功能

新的内容类型通常被定义成现有内容类型的特例化。这种层次结构在派生的内容类型与其基本类型之间建立了“is a”关系。插件开发者在实现内容敏感功能时必须采用此关系。如果给定的功能适用于给定的内容类型,该功能就必须也适用于任何派生的内容类型。IContentType.isKindOf(IContentType superType) 方法用来确定两个 IContentType 是否相关。方法 IContentType.getBaseType() 用来确定给定 IContentType 的基本类型。