欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
C# Stream作用
      C# Stream作用IO操作基本上需要用到Stream相關(guān)的子類(lèi),因此這類(lèi)問(wèn)題在CSDN問(wèn)得也是比較多。其實(shí)對于Stream來(lái)說(shuō),操作起來(lái)比較簡(jiǎn)單,只要對細節的處理稍微注意一下,相信在使用它的時(shí)候也會(huì )得心應手。對于Stream相關(guān)的問(wèn)題,大致分如下幾類(lèi)。問(wèn)題一,基本操作的問(wèn)題;問(wèn)題二,編碼的問(wèn)題;問(wèn)題三,尾部處理問(wèn)題;問(wèn)題四,Stream緩存問(wèn)題;問(wèn)題五,資源釋放問(wèn)題;最后一個(gè)問(wèn)題,說(shuō)說(shuō)如何使用Stream來(lái)更新大文件部分數據。
        對于問(wèn)題一,基本操作的問(wèn)題,主要是讀寫(xiě)問(wèn)題,主要是出現在文件數據比較大,需要循環(huán)寫(xiě)或者讀的時(shí)候。此時(shí)正確讀的形式如下。

  using ( FileStream fs = new FileStream  ( yourFile, FileMode.Open,FileAccess.Read,FileShare.None ) )

    {    int nRealRead = 0;

        byte[] bBuffer = new byte[1024];

        do

        nRealRead = fs.Read( bBuffer, 0, 1024 );          

         Debug.WriteLine( Encoding.Default.GetString( bBuffer, 0, nRealRead ) );

        }while( nRealRead == 1024 );

    }

        可是大多數人第一次完成這樣操作的時(shí)候,都會(huì )在“nRealRead = fs.Read( bBuffer, 0, 1024 );”這一句犯錯誤。認為第二個(gè)參數的偏移量對于Stream而設的,所以認為應該用累加的值,也就是目前總共讀了多少的字節數。這里需要理解一下Stream的操作,當進(jìn)行讀或者寫(xiě)操作的時(shí)候,Stream的游標會(huì )根據所讀或者所寫(xiě)得字節而自動(dòng)向前跟進(jìn);其次Stream.Read或者Stream.Write這兩個(gè)方法中第二個(gè)參數是針對第一個(gè)Buffer參數而言的,而不是對于Stream的,因此不要在這個(gè)地方犯錯誤。
       基本問(wèn)題還牽扯的就是文件打開(kāi)的方式。有人經(jīng)常問(wèn),如何同時(shí)用兩個(gè)Stream打開(kāi)同一個(gè)文件。其實(shí)默認的Stream打開(kāi)方式是獨享的,因此當不指明文件為訪(fǎng)問(wèn)共享的時(shí)候,后打開(kāi)文件操作就會(huì )出現異常,因此需要向我上面所寫(xiě)的那樣。還有,如果需要指定當前Stream的起始位置,可以通過(guò)Seek方法或者設置Position屬性來(lái)完成。
       對于問(wèn)題二,編碼問(wèn)題。有人使用Stream的子類(lèi),例如StreamReader之類(lèi)來(lái)打開(kāi)一個(gè)文本文件,發(fā)現讀出來(lái)的數據是亂碼,造成這個(gè)原因大多數由于文件中含有中文字符,同時(shí)打開(kāi)文件的時(shí)候沒(méi)有指明編碼方式。由于英文和中文的編碼方式不同,因此在不指明編碼的時(shí)候有時(shí)會(huì )造成讀取中文錯誤。此時(shí)只要使用StreamReader類(lèi)型中含有Encoding參數的構造函數即可,例如:using( StreamReader sr = new StreamReader( yourFile, Encoding.Default ) )
       這里只是采用系統默認的編碼方式,但有可能不太適合你文件的編碼方式,因此需要在實(shí)際應用去調試和變換這個(gè)參數。
        問(wèn)題三是,Stream尾部處理問(wèn)題。此類(lèi)問(wèn)題所展現的現象如,復制文件的時(shí)候文件會(huì )增大。因此在使用Stream.Read和Stream.Write的時(shí)候,要通過(guò)方法的返回值,來(lái)標明真正讀和寫(xiě)的字節數,就像前面所寫(xiě)的那樣。

       nRealRead = fs.Read( bBuffer, 0, 1024 );  // Read data

       Debug.WriteLine( Encoding.Default.GetString( bBuffer, 0, nRealRead ) );

此時(shí)在輸出的時(shí)候用的不是“1024”,而是“nRealRead”做為字節有效標示。

       對于問(wèn)題四,Stream緩存的問(wèn)題,這主要表現在寫(xiě)的時(shí)候。為了避免頻繁操作IO而降低效率,大多數Stream采用異步寫(xiě)的方式,也就是Stream對象要配備有一定的緩存,來(lái)暫時(shí)保存寫(xiě)的數據。但緩存是有限的,當緩存已滿(mǎn)后會(huì )造成后續寫(xiě)的數據不能寫(xiě)入,從而導致數據丟失。那么此時(shí)需要顯示的調用Stream.Flush方法,來(lái)把緩存的數據寫(xiě)入到文件中并清空緩存。其實(shí)這并不是唯一方法,在一些Stream的子類(lèi)中還提供了設置BufferSize的方法,或者提供了設置AutoFlush屬性來(lái)實(shí)現自動(dòng)寫(xiě)入等等,因此這里大家可以根據不同需要而選擇不同方法來(lái)完成。
        對于Stream的釋放問(wèn)題,這可能不單單是使用Stream的問(wèn)題,可能是使用C#編程而造成的不良習慣。雖說(shuō)C#的資源是受托管的,但是對于Stream來(lái)說(shuō),如果不及時(shí)釋放,那么當其他線(xiàn)程或者進(jìn)程使用此文件的時(shí)候就會(huì )造成無(wú)法打開(kāi)的現象(由于Stream大多數都是以獨享方式打開(kāi)),而且沒(méi)有及時(shí)關(guān)閉,所占用的Buffer無(wú)法及時(shí)釋放。因此養成一個(gè)好的習慣至關(guān)重要。其實(shí)釋放Stream很簡(jiǎn)單,要么顯示的調用其的Close和Dispose這兩個(gè)方法,要么使用using程序塊,就像我前面所寫(xiě)的那樣。
       最后一個(gè)就是如何使用Stream來(lái)更新大文件。比較常見(jiàn)的就是,當文件比較大,但是需要修改的部分很少,因此想要通過(guò)Stream直接在某個(gè)位置進(jìn)行類(lèi)似于刪除、插入或者替換等操作。對于一個(gè)文件的更新操作,大致分為三種,這里主要是考慮更新的位置和更新數據長(cháng)度。
      第一種對于文件尾擴展的操作,內容長(cháng)度不限;
      第二種等字節的替換操作,位置不限;
      最后一種就是位置不固定,字節數不確定。
      上面所說(shuō)的前兩種,進(jìn)行處理比較簡(jiǎn)單。對于第一種,只要設置FileMode的時(shí)候增加Append標示即可。而對于等字節的替換,就更簡(jiǎn)單了,直接通過(guò)Stream.Seek找到指定的位置,然后調用Stream.Write即可。
        而最后一個(gè),是最麻煩的。比較簡(jiǎn)單的解決方式,創(chuàng )建一個(gè)臨時(shí)文件,然后一邊讀一邊寫(xiě),遇到需要修改的,先讀出來(lái)再修改最后再寫(xiě)入。等全部寫(xiě)完了,刪除舊文件,修改臨時(shí)文件的名稱(chēng)為原來(lái)名字。比較麻煩的解決方式,就是通過(guò)Share方式,用一個(gè)讀Stream和一個(gè)寫(xiě)Stream直接操縱源文件。這里需要注意的是,為了保證新寫(xiě)的數據不要沖掉還沒(méi)讀出來(lái)的數據,也就是說(shuō)要控制寫(xiě)Stream所寫(xiě)的位置不要超過(guò)要讀的位置。舉例說(shuō),目前需要讀的位置是文件的800字節處,也就是說(shuō)800字節以后還沒(méi)讀出來(lái)處理,此時(shí)寫(xiě)Stream在寫(xiě)完數據后,Stream的位置不能超過(guò)800字節,如果寫(xiě)采用的是緩存,那么超過(guò)800位置的數據不要立刻通過(guò)Flush進(jìn)行提交??偟膩?lái)說(shuō),通過(guò)兩個(gè)Stream來(lái)操作同一個(gè)文件,對于這一點(diǎn)要特別注意,處理不好要造成死循環(huán)。
       Stream的問(wèn)題相對比較簡(jiǎn)單,大多數人操作的時(shí)候不注意細節。所以我這里只是稍加說(shuō)明,不做特別細的說(shuō)明。
本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
C#解決讀寫(xiě)包含漢字的txt文件時(shí)亂碼的問(wèn)題
編碼二進(jìn)制數據和文本相互轉換的控件Xceed Binary Encoding Library
C#讀寫(xiě)文件
[原創(chuàng )]C#中StreamWriter與BinaryWriter的區別兼談編碼。
ffmpeg+ffserver搭建流媒體服務(wù)器
適用于 php-5.2 的 php.ini 中文版
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久