二、文件容器和文件管理
OGRE 文件系统的核心是 Archive 和 DataStream。其中:Archive 泛指文件容器,可以是文件夹,也可以是压缩包,甚至可以为远程位置(Ogre1.06 还未发现有此功能)。
DataStream 完成与 std::basic_istream 相同的功能,它既可以读取普通的文件,压缩文件,以及内存文件等。
1、Archive
为完成 Archive 的功能(如列举目录下的文件,获取文件信息,查找文件等)OGRE提 供 了 一 个 统 一 的 接 口 ( 抽 象 基 类 ) Ogre::Archive , 具 体 的 实 现 分 别 由Ogre::FileSystemArchive 和 Ogre::ZipArchive 完成。由名称就可以看出它们的功能。
关于 Archive 的实例化,OGRE 采用了创建型设计模式中的抽象工厂模式。工厂模式在 OGRE 中其他地方也用到,因此有一个泛型工厂 Ogre::FactoryObj< T >:有了 Ogre::ArchiveFactory,就可以根据功能创建需要的 Archive 类型。若不能满足需要,用户可以以 Plug-in 形式扩充 Archive,一个 Archive 对应一个ArchiveFactory。
为 了 便 于 二 者 的 管 理 , OGRE 提 供 了 一 个 Archive 管 理 类——Ogre::ArchiveManager(使用了单件模式):所有的 ArchiveFactory 都必须注册到 ArchiveManager 中(OGRE 在 Root 的构造函数中注册上述两种 ArchiveFactory)。这样当给 ArchiveManager 一个路径和路径的类型时(load),ArchiveManager 就可以返回一个与类型的 Archive。删除Archive 也需要经过 ArchiveManager 卸载(unload)。
看一下 ArchiveManager 内部的数据结构:
typedef std::map<String, ArchiveFactory*> ArchiveFactoryMap;
ArchiveFactoryMap mArchFactories;
typedef std::map<String, Archive*> ArchiveMap;
ArchiveMap mArchives;
2、Data Stream
Data Stream 完成与 std::basic_istream 相同的功能,但 Data Stream 的数据来源多种多样,包括与 STL stream 接口不兼容的 lib(如 zlib)。为满足各种情况,OGRE 为Data Stream 提供如下的继承体系,从名称可以看出各自的功能:
Ogre::DataStream 是一个抽象的基类,具体的操作(如 readLine、skip、seek、tell 等)由其子类负责实现。从设计模式的角度看,是属于适配器模式。
1) Ogre::MemoryDataStream
Memory Data Stream可以看作是一块内存区域,OGRE 分配的是一块 usingned char 内存,由’\n’形成行。对 Memory Data Stream 的操作,可以看作是对字符串的处理,只不过其接口是按照文件的标准来设计的。
2) Ogre::ZipDataStream
OGRE 是用 zziplib 实现读取压缩文件。它是对 zziplib 包装,使 zziplib 能够符合Ogre::DataStream 的接口。
Archive 可以看作是文件夹(包括压缩的),里面包含有文件,而 DataStream 是对文件的操作(读取、修改等)。
读取文件夹是为了读取其中的文件,因此,一个程序若提供了一个 ArchiveFactory,也应该提供一个 DataStream 以从 Archive 中读取出数据。除非现有的 DataStream 实现能够满足需求。
OGRE 文件系统的核心是 Archive 和 DataStream。其中:Archive 泛指文件容器,可以是文件夹,也可以是压缩包,甚至可以为远程位置(Ogre1.06 还未发现有此功能)。
DataStream 完成与 std::basic_istream 相同的功能,它既可以读取普通的文件,压缩文件,以及内存文件等。
1、Archive
为完成 Archive 的功能(如列举目录下的文件,获取文件信息,查找文件等)OGRE提 供 了 一 个 统 一 的 接 口 ( 抽 象 基 类 ) Ogre::Archive , 具 体 的 实 现 分 别 由Ogre::FileSystemArchive 和 Ogre::ZipArchive 完成。由名称就可以看出它们的功能。
关于 Archive 的实例化,OGRE 采用了创建型设计模式中的抽象工厂模式。工厂模式在 OGRE 中其他地方也用到,因此有一个泛型工厂 Ogre::FactoryObj< T >:有了 Ogre::ArchiveFactory,就可以根据功能创建需要的 Archive 类型。若不能满足需要,用户可以以 Plug-in 形式扩充 Archive,一个 Archive 对应一个ArchiveFactory。
为 了 便 于 二 者 的 管 理 , OGRE 提 供 了 一 个 Archive 管 理 类——Ogre::ArchiveManager(使用了单件模式):所有的 ArchiveFactory 都必须注册到 ArchiveManager 中(OGRE 在 Root 的构造函数中注册上述两种 ArchiveFactory)。这样当给 ArchiveManager 一个路径和路径的类型时(load),ArchiveManager 就可以返回一个与类型的 Archive。删除Archive 也需要经过 ArchiveManager 卸载(unload)。
看一下 ArchiveManager 内部的数据结构:
typedef std::map<String, ArchiveFactory*> ArchiveFactoryMap;
ArchiveFactoryMap mArchFactories;
typedef std::map<String, Archive*> ArchiveMap;
ArchiveMap mArchives;
2、Data Stream
Data Stream 完成与 std::basic_istream 相同的功能,但 Data Stream 的数据来源多种多样,包括与 STL stream 接口不兼容的 lib(如 zlib)。为满足各种情况,OGRE 为Data Stream 提供如下的继承体系,从名称可以看出各自的功能:
Ogre::DataStream 是一个抽象的基类,具体的操作(如 readLine、skip、seek、tell 等)由其子类负责实现。从设计模式的角度看,是属于适配器模式。
1) Ogre::MemoryDataStream
Memory Data Stream可以看作是一块内存区域,OGRE 分配的是一块 usingned char 内存,由’\n’形成行。对 Memory Data Stream 的操作,可以看作是对字符串的处理,只不过其接口是按照文件的标准来设计的。
2) Ogre::ZipDataStream
OGRE 是用 zziplib 实现读取压缩文件。它是对 zziplib 包装,使 zziplib 能够符合Ogre::DataStream 的接口。
3) Ogre::FileHandleDataStream 和 Ogre::FileStreamDataStream
分别为对 C 语言的 FILE 和 C++ stream 的适配。
4) Ogre::DeflateStream
实现对文件的压缩、读取压缩文件,是对zlib的适配
3、Archive 和 DataStream 之间的关系Archive 可以看作是文件夹(包括压缩的),里面包含有文件,而 DataStream 是对文件的操作(读取、修改等)。
读取文件夹是为了读取其中的文件,因此,一个程序若提供了一个 ArchiveFactory,也应该提供一个 DataStream 以从 Archive 中读取出数据。除非现有的 DataStream 实现能够满足需求。