• <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>
            posts - 94, comments - 250, trackbacks - 0, articles - 0
              C++博客 :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

            IO子系統(tǒng)

            Nebula3的IO系統(tǒng)相對于Nebula1和2是一個巨大的進(jìn)步, 新系統(tǒng)的主要設(shè)計目標(biāo)有:

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

            IO子系統(tǒng)的一些主要概念:

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

            這里有個很好的代碼例子可以反映出Nebula3輸入輸出系統(tǒng)的強(qiáng)大:

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

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

            標(biāo)準(zhǔn)重定向符

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

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

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

            URI(統(tǒng)一資源定位符)

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

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

            IO::URI類用來傳遞URI并且解析URI字符串到它的各個部分中. 值得注意的是URI對象比字符串占用更多的內(nèi)存, 所以有時把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)提供了用于儲存和傳輸原始數(shù)據(jù)的接口. 一個流對象提供了傳統(tǒng)的Open()/Close()/Read()/Write()/Seek()接口, 其中有些還提供內(nèi)存映射, 這樣數(shù)據(jù)的讀寫可以直接通過內(nèi)存訪問來實現(xiàn). Stream對象用一個IO::URI對象來定義它們的資源位置. 通常情況下, 一個URI格式映射到一個特定的流對象. 例如”http:”URI格式一般映射到Net::HttpStream類, 而”file:”格式則映射到IO:FileStream類. 這個映射由StreamServer構(gòu)造一個流對象并匹配一個URI. 一個Nebula3應(yīng)用程序通過StreamServer::Register()方法來注冊這個映射關(guān)系, 這也是新的流對象和URI格式的注冊方法.

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

            • IO::FileStream: 提供了訪問主機(jī)文件系統(tǒng)的功能
            • IO::MemoryStream: 一個具有流接口的動態(tài)內(nèi)存緩沖
            • IO::HttpStream: 提供了一個流接口來訪問HTTP服務(wù)器文件

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

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

            這里有一個用XmlReader從HTTP服務(wù)器訪問文件的簡單例子

            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(文件服務(wù)器)

            Nebula3 IO::FileServer類提供了一個單件用于訪問主機(jī)的文件系統(tǒng)進(jìn)行一些全局操作, 像定義重定向符, 復(fù)制, 刪除和檢查文件是否存在, 列出目錄內(nèi)容, 等等.

            這個代碼片斷介紹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:", "*");

            控制臺

            一般不直接調(diào)用IO::Console, 直接n_printf(), n_error(), n_dbgout(), n_warning()@_@


            只有注冊用戶登錄后才能發(fā)表評論。
            網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


            精品久久亚洲中文无码| 久久久精品国产亚洲成人满18免费网站 | 久久久久久一区国产精品| 久久精品一区二区影院| 97视频久久久| 色偷偷888欧美精品久久久| 国产精品久久久99| 伊人久久大香线蕉av不卡| 久久最近最新中文字幕大全| 无码乱码观看精品久久| 久久国产乱子精品免费女| 久久伊人五月丁香狠狠色| 国产激情久久久久影院小草| 欧洲精品久久久av无码电影| 久久免费视频6| 久久国产精品久久久| 亚洲AV无码1区2区久久 | 亚洲伊人久久综合中文成人网| 欧洲人妻丰满av无码久久不卡| 久久久久无码精品国产app| 2021久久国自产拍精品| 一本色道久久88综合日韩精品| 狠狠综合久久综合中文88| 国内精品久久久久久99蜜桃 | 久久久久久久97| 婷婷五月深深久久精品| 亚洲欧美另类日本久久国产真实乱对白 | 国产一久久香蕉国产线看观看| 久久大香萑太香蕉av| 性做久久久久久久久老女人| 99国内精品久久久久久久| 青青草原综合久久大伊人精品| 精品久久久噜噜噜久久久| 久久婷婷五月综合97色 | 99久久www免费人成精品| 99久久99这里只有免费费精品| 狠狠色噜噜色狠狠狠综合久久| 久久久久青草线蕉综合超碰| 久久亚洲国产精品成人AV秋霞| 久久久久亚洲av综合波多野结衣| 久久综合九色综合网站|