IO子系统
Nebula3的IO系统相对于Nebula1和2是一个巨大的进步, 新系统的主要设计目标有:
IO子系统的一些主要概念:
这里有个很好的代码例子可以反映出Nebula3输入输出系统的强大:
1: IO::FileServer::Instance()->CopyFile("http://www.radonlabs.de/index.html", "temp:index.html"); |
---|
这一行代码从HTTP服务器拷贝了一个文件到当用户的临时目录里去. 再多加几行代码, 你可以创建一个流对象指向HTTP服务器上的HTML文件, 连接一个XML reader到这个流上, 然后就可以在不存储中间文件的基础上进行解析HTML了.
标准重定向符
Nebula3初始化了以下几个重定向符:
其它重定向符可以在程序运行时进行定义. 通常情况下会定义一些抽象资源路径, 如textuers, sound, data等等. 这样的话资源的路径就可以只更改重定向符的定义而是不是去替换所有的路径. 重定向符的另一个好处就是减少了路径字符串的长度, 在一定程序上节省了内存占用.
URI(统一资源定位符)
在Nebula3中的资源位置通常都是用URI定义的. URI一般包括下面这几部, 有一些是可选的:
IO::URI类用来传递URI并且解析URI字符串到它的各个部分中. 值得注意的是URI对象比字符串占用更多的内存, 所以有时把URI保存在字符串中, 并在需要分割的时候才使用IO::URI类会更好一些.
这里有一些URI的例子:
1: file:///c:/temp/bla.txt
2: file://samba/temp/bla.txt
3: http://www.radonlabs.de/index.html
4: http://user:password@www.myserver.com:8080/index.html#main
通过使用重定位符会大大简化路径名称. 要引用一个程序目录的文件你可以使用”home:bla.txt”, 等价于file:///c:/Program Files/[myapp]/bla.txt.
Stream, Reader 和 Writer
流(Stream)提供了用于储存和传输原始数据的接口. 一个流对象提供了传统的Open()/Close()/Read()/Write()/Seek()接口, 其中有些还提供内存映射, 这样数据的读写可以直接通过内存访问来实现. Stream对象用一个IO::URI对象来定义它们的资源位置. 通常情况下, 一个URI格式映射到一个特定的流对象. 例如”http:”URI格式一般映射到Net::HttpStream类, 而”file:”格式则映射到IO:FileStream类. 这个映射由StreamServer构造一个流对象并匹配一个URI. 一个Nebula3应用程序通过StreamServer::Register()方法来注册这个映射关系, 这也是新的流对象和URI格式的注册方法.
让我们来看看有哪些重要的类:
Stream reader和writer类提供了一些舒适的接口专门处理特定的数据格式. 这里有一些stream reader和writer:
这里有一个用XmlReader从HTTP服务器访问文件的简单例子
1: using namespace IO;
2:
3: Ptr<Stream> stream = StreamServer::Instance()->CreateStream("http://www.radonlabs.de/index.html");
4: Ptr<XmlReader> xmlReader = XmlReader::Create();
5: xmlReader->SetStream(stream);
6: if (xmlReader->Open())
7: {
8: // parse content here using the XmlReader interface
9: }
File Server(文件服务器)
Nebula3 IO::FileServer类提供了一个单件用于访问主机的文件系统进行一些全局操作, 像定义重定向符, 复制, 删除和检查文件是否存在, 列出目录内容, 等等.
这个代码片断介绍FileServer的一些有用的方法:
using namespace IO;
using namespace Util;
FileServer* fs = FileServer::Instance();
// check if a file or directory exists
bool fileExists = fs->FileExists("home:bla.txt");
bool dirExists = fs->DirectoryExists("temp:bla/blub");
// resolve a path with assigns into an absolute filesystem
// path, this is sometimes necessary to interface with
// 3rd party libraries which don't understand Nebula3 paths directly
String absPath = fs->ResolveAssings("user:myapp/savegames");
// create a directory, note that all missing subdirectories will
// be created as well
fs->CreateDirectory("user:myapp/savegames");
// copy and delete files
fs->CopyFile("home:movie.mpg", "temp:movie.mpg");
fs->DeleteFile("temp:movie.mpg");
// list files in a directory matching a pattern
Array<String> files = fs->ListFiles("temp:", "*.txt");
// list all subdirectories in temp:
Array<String> dirs = fs->ListDirectories("temp:", "*");
控制台
一般不直接调用IO::Console, 直接n_printf(), n_error(), n_dbgout(), n_warning()@_@