2009年1月31日星期六

Streams, Readers and Writers

Nebula3 IO子系统提供Stream对象作为通用的数据存储和传输通道。stream的子类实现或者包装特定的数据传输协议。Stream类一般和URI相关联。

* "file:" scheme maps to IO::FileStream class
* "http:" scheme maps to Net::HttpStream class
* "mem:" scheme maps to IO::MemoryStream class

Nebula3现在提供了这些开箱即用的URI schemes和相关stream类。Stream对象一般是通过
IO::Server::CreateStream()方法来创建的,该方法带有一个URI参数并返回一个适当的Stream对象:

// create a HttpStream and a FileStream object
IO::Server* ioServer = IO::Server::Instance();
Ptr<> httpStream = ioServer->CreateStream("http://www.radonlabs.de/index.html);
Ptr<> fileStream = ioServer->CreateStream("home:readme.txt");

一个应用程序可以使用IO::Server::RegisterUriScheme()方法把stream类和URI schemes关联起来。

Stream仅仅提供通用的Read()和Write()方法去读写内存块。可以通过很简便的方式读写流数据,StreamReader和StreamWriter就是用来读写流的。不同的StreamReader和StreamWriter子类提供读写不同类型的数据。Nebula3 IO子系统提供了以下的读写类:

* BinaryReader/Writer: 读写二进制格式的流
* TextReader/Writer: 读写文本流
* XmlReader/Writer: 读写XML格式的数据

下面的代码展示了从HTTP服务上解析一个简单的XML文件:

// create a stream and attach an XML reader to it
Ptr< Stream> stream = IO::Server::Instance()->CreateStream("http://www.radonlabs.de/books.xml");
Ptr< XmlReader> xmlReader = XmlReader::Create();
xmlReader-> SetStream(stream);

// start reading...
if (xmlReader-> Open())
{
// iterate through "books" xml elements
if (xmlReader-> SetToFirstChild("books")) do
{
// read attributes from current element
String author = xmlReader-> GetString("author");
int year = xmlReader-> GetInt("year");
int numPages = xmlReader->GetInt("pages");
...
}
while (xmlReader-> SetToNextChild("books"));
xmlReader->Close;
}

其它Nebula3子系统可以继承StreamReader和StreamWriter实现自己的读写类。例如,消息子系统为了持久化message对象就提供了MessageReader和MessageWirter类。

原文: Streams, Readers and Writers

[声明]:限于译者水平,文中难免错漏之处,欢迎各位网友批评指正;

没有评论:

发表评论