青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

posts - 94, comments - 250, trackbacks - 0, articles - 0
  C++博客 :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

Nebula3學習筆記(4): IO系統

Posted on 2008-12-14 21:28 Condor 閱讀(1187) 評論(0)  編輯 收藏 引用

IO子系統

Nebula3的IO系統相對于Nebula1和2是一個巨大的進步, 新系統的主要設計目標有:

  • 使用更標準的機制, 如用URI來定位資源, 用MIME類型來區分數據格式
  • 一個靈活的流模型, 它不關心數據是來自文件, 內存, HTTP連接還是其它地方
  • 從流讀寫不數據的數據類型也更方便, 例如要讀取的XML格式數據來自文件/內存/網絡都沒問題
  • 另外, 新的流和讀寫類可以在運行時注冊到IO系統中
  • 相對于系統平臺的特定IO函數, 像fopen()這樣的C Lib函數會有額外的性能或內存損失. 所以在保證可移植性的前提下不損失性能, 必須使用特定平臺的IO函數

IO子系統的一些主要概念:

  • 一個中樞的IO::Console 對象連接控制臺處理器(console handler)來進行文本的輸入和輸出. 這保證了所有的Nebula3的文本輸出都通過一個集中的進出通道. 特定的控制臺處理器可以用特定的方式處理文本輸出(例如輸出到stdout, 游戲控制臺, 日志文件或網絡連接).
  • 重定向符做為路徑別名. 大體的功能跟Nebula1和2差不多, 除了從AmigaOS 的重定向符得到的靈感. Nebula3重定向符的一個新特性就是它們可以做為URI的別名. 例如, 重定向符”textures:”可以定義為 "http://www.radonlabs.de/textures", 這樣簡化的資源路徑"textures:mytexture.dds"就會解釋成這個絕對路徑: "http://www.radonlabs.de/textures/mytexture.dds" (太NB了, 把紋理放到網站上加載? 哈哈, 拿來做內置廣告肯定很爽)
  • 流(Stream)做為基本的數據進出通道. 它提供了基本的API函數 Open()/Close()/Read()/Write(), 但是可能完全隱藏了傳輸和存儲通道. 典型的例子有IO::FileStream, IO::MemoryStream, 或 Net::HttpStream
  • Stream reader 和 writer 是連接到流上并且實現了簡單易用的接口來讀寫數據格式. 例如你可以把IO::XmlReader連接到IO::FileStream來從文件系統讀取XML格式的數據, 或者連接到IO::HttpStream來從HTTP連接讀取XML格式的數據.

這里有個很好的代碼例子可以反映出Nebula3輸入輸出系統的強大:

1: IO::FileServer::Instance()->CopyFile("http://www.radonlabs.de/index.html", "temp:index.html");

這一行代碼從HTTP服務器拷貝了一個文件到當用戶的臨時目錄里去. 再多加幾行代碼, 你可以創建一個流對象指向HTTP服務器上的HTML文件, 連接一個XML reader到這個流上, 然后就可以在不存儲中間文件的基礎上進行解析HTML了.

標準重定向符

Nebula3初始化了以下幾個重定向符:

  • home: 指向應用程序目錄, 一般在” C:\Program Files “下. Nebula3把這個目錄當成只讀的, 為的是不需要管理員權限就能運行.
  • user: 這個指向當前登錄的用戶目錄, 一般是指” C:\Documents and Settings\[username] “. Nebula3會自動創建一個本地目錄來避免不同程序覆寫掉它們的數據. 所以說一般情況下把數據寫入用戶目錄是安全的. 這個地方可以用于保存游戲數據和配置, 或者程序需要調用的持久性數據.
  • temp: 這個指向當前用戶的臨時目錄, 一般是可寫的, 但是不要假設下一次啟動程序時數據還存在.
  • bin: 這個指向應用程序可執行文件的目錄. 它可以跟home相同, 也可能不同. 這個目錄應該也當成是只讀的來對待.

其它重定向符可以在程序運行時進行定義. 通常情況下會定義一些抽象資源路徑, 如textuers, sound, data等等. 這樣的話資源的路徑就可以只更改重定向符的定義而是不是去替換所有的路徑. 重定向符的另一個好處就是減少了路徑字符串的長度, 在一定程序上節省了內存占用.

URI(統一資源定位符)

在Nebula3中的資源位置通常都是用URI定義的. URI一般包括下面這幾部, 有一些是可選的:

  • 模式(協議?), 如"http:", "file:", 等... Nebula3 沒有硬編碼任何模式, 而跟流類綁定在一起注冊到IO::StreamServer 單件
  • 一個可選的用戶信息字段, 這是一個用戶名和密碼用于HTTP或FTP主機的身份驗證
  • 一個主機名, 如"www.radonlabs.de"
  • 一個在主機名后可選的端口號
  • 一個本地路徑, 指向主機上的一個資源
  • 一個可選的片段, 通常指向資源內部的一個位置
  • 一個可選的查詢部分, 一般包含一個PHP腳本或其它相似的動態響應機制的參數

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格式的注冊方法.

讓我們來看看有哪些重要的類:

  • IO::FileStream: 提供了訪問主機文件系統的功能
  • IO::MemoryStream: 一個具有流接口的動態內存緩沖
  • IO::HttpStream: 提供了一個流接口來訪問HTTP服務器文件

Stream reader和writer類提供了一些舒適的接口專門處理特定的數據格式. 這里有一些stream reader和writer:

  • IO::BinaryReader/IOBinaryWriter: 讀寫二進制數據
  • IO::TextReader/IOTextWriter: 讀寫文本數據
  • IO::XmlReader/IOXmlWriter: 讀寫XML格式的數據
  • Messaging::MessageReader/MessagingMessageWriter: 消息序列化

這里有一個用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()@_@


只有注冊用戶登錄后才能發表評論。
網站導航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            999亚洲国产精| 欧美一区二区三区四区夜夜大片 | 欧美一区二区三区免费在线看| 一区二区三区在线观看欧美| 香蕉久久国产| 欧美中文在线视频| 在线观看日韩www视频免费| 欧美aa国产视频| 欧美日韩亚洲91| 欧美一区二区三区精品电影| 亚洲欧美日本伦理| 狠狠色狠狠色综合系列| 欧美电影在线播放| 欧美日韩亚洲一区二| 欧美永久精品| 免费观看亚洲视频大全| 亚洲午夜影视影院在线观看| 先锋亚洲精品| 亚洲美女黄网| 亚洲欧美一区二区三区在线| 在线观看不卡av| 99热免费精品| 悠悠资源网亚洲青| 亚洲另类在线视频| 国产亚洲一级高清| 亚洲区中文字幕| 国产在线乱码一区二区三区| 亚洲福利视频网| 国产美女一区| 99精品欧美一区| 1024亚洲| 亚洲欧美日韩精品久久| 亚洲激情视频在线| 欧美一区二区三区在线观看| 99国产精品私拍| 久久偷看各类wc女厕嘘嘘偷窃| 国产乱码精品一区二区三区忘忧草| 亚洲毛片在线看| 欧美在线日韩在线| 一区二区三区四区国产精品| 久久久久久夜| 欧美在线看片| 欧美视频中文字幕在线| 欧美高清视频www夜色资源网| 久久成人精品| 亚洲欧美国产精品桃花| 欧美国产日本高清在线| 久久性天堂网| 国产视频不卡| 亚洲精品欧美精品| 亚洲国产欧美精品| 久久久免费av| 久久久久久网| 国产色产综合色产在线视频| 亚洲一区二区精品在线观看| 亚洲视频精选| 欧美日韩国产成人在线免费| 亚洲电影免费| 日韩视频免费大全中文字幕| 欧美精品久久一区二区| 亚洲精品社区| 99国内精品久久久久久久软件| 欧美人与性动交a欧美精品| 欧美v亚洲v综合ⅴ国产v| 国产一区二区三区成人欧美日韩在线观看 | 最新国产成人在线观看| 久久国产福利国产秒拍| 欧美一区二区三区精品电影| 国产精品美女久久久久久2018 | 亚洲国内自拍| 久久综合999| 欧美承认网站| 91久久国产自产拍夜夜嗨| 久久天堂av综合合色| 免费观看欧美在线视频的网站| 免费观看日韩av| 欧美黑人多人双交| 亚洲精品日本| 欧美日本成人| 亚洲一级高清| 久久久久国产免费免费| 一区二区在线视频| 久久色在线观看| 亚洲黄色一区二区三区| 亚洲四色影视在线观看| 国产精品美女久久久| 久久精品国产99国产精品| 免费日韩成人| 亚洲性视频网站| 国产一区二区欧美| 欧美韩日亚洲| 亚洲欧美在线另类| 蜜桃av噜噜一区二区三区| 日韩一级在线观看| 国产欧美精品日韩区二区麻豆天美 | 亚洲欧洲在线一区| 欧美日韩麻豆| 欧美在线一二三| 亚洲欧洲精品一区二区三区不卡 | 欧美激情精品久久久久久变态| 小黄鸭精品aⅴ导航网站入口| 免费亚洲婷婷| 亚洲午夜小视频| 欧美96在线丨欧| 亚洲女同同性videoxma| 亚洲风情亚aⅴ在线发布| 欧美视频免费在线观看| 久久精品视频播放| 在线视频你懂得一区二区三区| 亚洲精品在线一区二区| 国产欧美精品日韩区二区麻豆天美 | 一本大道久久a久久精二百| 国产欧美日韩亚洲| 欧美日韩ab片| 久久综合电影一区| 亚洲免费一区二区| 亚洲美女视频在线免费观看| 老司机免费视频久久| 亚洲欧美怡红院| 日韩午夜激情| 亚洲国产精品欧美一二99| 国产乱码精品一区二区三区不卡| 日韩午夜一区| 亚洲第一级黄色片| 久久精品一区二区三区四区| 亚洲综合成人婷婷小说| 亚洲精品乱码久久久久久久久| 久久综合九色综合欧美就去吻| 久久伊伊香蕉| 欧美永久精品| 亚洲欧美经典视频| 一区二区三区免费看| 亚洲精品永久免费| 亚洲国产合集| 亚洲第一中文字幕| 国产主播一区二区| 国产精品网红福利| 国产精品久久久久久久久搜平片| 亚洲欧美日韩国产综合| 亚洲夜间福利| 亚洲一级二级在线| 亚洲一区欧美一区| 亚洲综合色自拍一区| 亚洲色在线视频| 亚洲私人影院| 亚洲欧美日韩在线观看a三区 | 亚洲无人区一区| 一区二区三区国产精华| 一本久久综合| 亚洲一区视频在线| 午夜精品久久久久久久| 欧美一区二区三区在线播放| 午夜伦理片一区| 久久精品国产96久久久香蕉| 久久久国产91| 欧美激情第三页| 亚洲国产视频直播| 一本大道久久精品懂色aⅴ| 9人人澡人人爽人人精品| 在线视频亚洲| 久久成人免费电影| 欧美jizzhd精品欧美巨大免费| 亚洲网站视频福利| 欧美在线三区| 久久夜色精品国产噜噜av| 欧美激情区在线播放| 国产精品成人播放| 国产手机视频一区二区| 91久久精品一区二区三区| 亚洲视频一区二区免费在线观看| 国产一区二区三区精品久久久| 欧美极品在线视频| 国产精品美女久久久久久免费| 免费观看久久久4p| 国产精品福利影院| 韩国成人福利片在线播放| 亚洲国产一成人久久精品| 中文有码久久| 老色批av在线精品| 一区二区三区黄色| 久久精品女人| 国产精品www.| 在线国产亚洲欧美| 亚洲欧美网站| 亚洲第一精品电影| 亚洲免费视频观看| 欧美日本国产一区| 一区在线免费观看| 亚洲午夜一区二区| 欧美激情国产日韩| 性做久久久久久| 欧美人与性动交α欧美精品济南到 | 久久九九国产| 亚洲精选一区二区| 久久亚洲一区二区| 国产情侣一区| 亚洲一级网站| 亚洲欧洲一区| 欧美88av| 亚洲电影第1页|