使用內容類型

附註: 針對此處的說明,我們在提及內容時,會特別避免使用檔案的字眼。執行時期內容引擎不會假設內容是包含在檔案系統的檔案中。但是,它的確包含允許將內容類型關聯 檔案命名型樣的協定。實際上,這些檔名代表檔案系統中的檔案,但是內容系統的實作方式會假設內容是位在檔案系統中。 檔案編碼和內容類型會說明由平台資源外掛程式所提供的檔案導向內容類型功能, 且是有興趣在環境定義中使用內容類型 API 的開發人員必讀的項目。

瞭解內容類型

內容類型是由 IContentType 表示。這個介面代表一個唯一內容類型,其知道如何讀取資料串流以及解譯內容類型專屬的資訊。內容類型在本質上是階層式的。例如,XML 資料的內容類型即視為文字內容類型的子項。 這允許新的內容類型能輕易使用更一般化的內容類型屬性或行為。

IContentTypeManager 是提供存取權給平台執行時期所提供之大部分內容類型相關 API 的進入點。為了取得平台 IContentTypeManager 的參照, 用戶端可以使用平台 API:

IContentTypeManager contentTypeManager = Platform.getContentTypeManager();

用戶端可以使用平台 IContentTypeManager 來瞭解系統中的內容類型相關資訊。

偵測資料串流的內容類型

藉由提供位元組串流,您可以呼叫 IContentTypeManager API 來判定其內容類型,如下所示:

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

如此會傳回輸入提供之最適當的 IContentType, 如果找不到,則傳回 null。一個給定的資料串流可能有多個適當的內容類型。在這種情況下, 平台會使用一些啟發的方式來判定應選取哪一個內容類型。 檔案名稱是用來選取內容類型的第一個準則。其可以省略,但會有兩個問題: 結果可能不正確,因為許多不相關的內容類型可能會接受相同的輸入;同時也會有很大的效能問題, 因為平台中的所有內容類型都必須有機會分析串流。因此,除非無法取得,否則用戶端一律應該隨串流提供檔案名稱。

說明資料串流

在平台中內容類型支援另一個有趣的特性是,二進位或字元串流的說明內容功能。 下列程式碼片段顯示了執行的方式:

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

傳回的 IContentDescription 實例會說明內容類型,以及從提供的內容中擷取的其他相關資訊。內容說明會以鍵值配對的格式,儲存內容專屬的內容。平台本身能夠說明字集和文字型串流位元組順序之類的內容, 但其他項目則可由內容類型提供者來定義。

提供內容相關特性

新的內容類型通常會定義成現有內容類型的特殊形式。這個階層會在衍生的內容類型和其基本類型之間,建立 "is a" 關係。在實作內容相關的特性時, 外掛程式開發人員必須遵守這個關係。如果給定的特性適用於給定的內容類型, 該特性也必須適用於任何衍生的內容類型。 IContentType.isKindOf(IContentType superType) 方法可判斷兩個 IContentType 是否相關。方法 IContentType.getBaseType() 可判斷給定 IContentType 的基本類型。