自我学习记录!
Charpter4文档类型检测
我们来讨论下分类系统。分类学是科学的分类。分类被用作以识别和归类的概念来更好的理解和共享的词汇描述事物。例如,林奈分类法(the Linnaean taxonomy)是经典的系统命名所有的生物机体通过使用两部分的拉丁名,其同时识别属类以及种类。“Homo sapiens”表明现代的人类物种是前类人物种的一部分,随着消失的“Homo neanderthalensis”人一样。同样的分类法也在用来识别数字文件格式,叫做互联网媒体类型系统。
分类法经常是与识别和检测特定的事物相联系的。例如,生物学分类是以物种的出现信息的描述,其表现特征或增长模式,DNA结构等方式来识别任意的动植物的物种。同样的机制也在检测数字文档格式中使用。
在这一章节,我们将会深入文档格式的分类以及解析如何使用分类与其他的机制来确定文档的实际的类别。第一步是介绍互联网媒体类型系统和tika如何处理媒体类型。然后,查看tika中不同类型的检测机制。最后将会把这些放在一起,通过一个简单的示例程序来帮你感受使用tika的文档类型检测系统。
4.1互联网媒体类型
正如你在1.1.1节记住的,在RFC2046中记录的互联网媒体类型系统是最好的标准作为识别文档类型。媒体类型(或者说是MIME类型,通常被叫做互联网多用途邮件扩充协议标准)在无论何时你浏览网页或读取邮件内部交流中起关键性的作用。总之,MIME类型在你的电脑与某个特殊文件交互的任何时候都给出正确的执行程序。例如,你曾经想过你的浏览器是如何知道什么时候它遇到的是一个短视频,应该加载相应的播放器播放而不是将其作为二进制或文本内容展示在你的浏览器中。
大多数的浏览器(展示的Firefox的媒体类型对应的程序)明确的或暗示地必须理解文件内部的媒体类型并且知道如何去处理。不知道互联网上的媒体类型与其相关的程序,你的浏览器将会展示出绝大多数的是纯ASCII文本,这可一点儿也没趣。
我们深入到互联网媒体类型的命名主题。在这之后将会介绍8个顶级的媒体类型,就在IANA媒体类型注册中。我们将会简短的描述IANA注册与别的一些东西,以及tika如何对媒体类型注册中的信息使用来准确且可靠地检测媒体类型。
4.1.1媒体类型名的使用
媒体类型名由type/subtype组成定义和一个可选的参数“name=value”,下图可见其基于林奈分类法。Type/subtype部分和参数名被限制为US-ASCII字符集,也以不区分大小写处理。
Type/subtype部分告诉你正在处理的文档格式,可选的参数增加需要的特定格式信息去处理文档。例如,媒体类型“text/plain;charset=UTF-8”表明使用UTF-8编码的纯文本文档。同样的是,“image/jpeg”类型表明一个以JPEG/JFIF图像格式存储的图片。
当处理大量文档和媒体类型时,肯定会不时地遇到异常情况。常见的错误是媒体类型名部分的顺序反转,如“charset=utf-8;text/html”。一个工具如tika帮助程序免去处理这类问题的复杂性。
现在我们知道一个媒体类型长什么样了,很自然地去想什么类型被使用,如何管理已知的媒体类型集。
4.1.2媒体类型的种类
当前有8种正式的顶级媒体类型,就如下图所示的,以及成千上万中注册或已知的子类型。与林奈动物分类法相似,这些顶级媒体类型作为分类和管理互联网媒体类型分类的基础。
除了正式的8个顶级类型,有作为示例使用的保留类别“example/*”。一些实验性的程序可能会使用未注册的顶级类型格式“x-*/*”,但是更常见的使用未注册的子类型,像“application/x-*”或“image/x-*”。
随着媒体类型的确定,它们需要以某种方式持久化,这样别人就可以查找它们的定义并了解它们的关系。媒体类型为此存储在一个“media type registry”。在你试图创建自己的类型之前是有一些不变已存在的媒体类型是值得理解其中一些,包括最大的最易理解的源,IANA注册。
4.1.3IANA与其他类型注册
在它其余职责中,IANA保留维持一份正式的注册媒体类型列表。这个列表是公开地在“http://www.iana.org/assignments/media-types/”网页上,任何人想要注册新的类型都需要按照RF