LOGO OA教程 ERP教程 模切知識(shí)交流 PMS教程 CRM教程 開(kāi)發(fā)文檔 其他文檔  
 
網(wǎng)站管理員

Stream 數(shù)據(jù)流在 C# 中是如何工作的?

admin
2024年10月29日 18:54 本文熱度 682

流是 C# 中的一個(gè)基本概念,用于處理可能需要一些時(shí)間才能完成的大量數(shù)據(jù)、網(wǎng)絡(luò)通信和文件 I/O 操作。在許多情況下,這些操作的持續(xù)時(shí)間是不可預(yù)測(cè)的,因此擁有一種在等待結(jié)果時(shí)不會(huì)阻止整個(gè)過(guò)程的機(jī)制至關(guān)重要。

Stream 是一個(gè)抽象,它們攜帶一個(gè)字節(jié)序列。這些字節(jié)表示一些信息;一個(gè)重要的方面是,在通過(guò) Streams 讀取數(shù)據(jù)時(shí),您不需要在內(nèi)存中加載所有內(nèi)容

Streams 有一些操作,可以讀取一些仍然需要加載的信息。這些操作是 ReadWrite 和 Seek。那么讓我們談?wù)勊???

使用 Streams ?? 的好處

  • 非阻塞操作:Streams 允許在不凍結(jié)主線程的情況下進(jìn)行數(shù)據(jù)處理,從而提高應(yīng)用程序的響應(yīng)能力。

  • 即時(shí)數(shù)據(jù)訪問(wèn):即使操作尚未完全完成,您也可以讀取或?qū)懭霐?shù)據(jù),從而實(shí)現(xiàn)更靈活的數(shù)據(jù)處理。

  • 資源效率:Streams 通過(guò)以塊的形式處理數(shù)據(jù)而不是一次加載所有內(nèi)容,幫助最大限度地減少內(nèi)存使用量。

  • 可伸縮性:Streams 非常適合需要大規(guī)模數(shù)據(jù)處理的場(chǎng)景,例如讀取日志文件或流式傳輸多媒體內(nèi)容。

流??的潛在缺點(diǎn)

  • 復(fù)雜性:處理流可能比處理靜態(tài)數(shù)據(jù)更復(fù)雜,需要小心處理以避免數(shù)據(jù)損壞等問(wèn)題。

  • 錯(cuò)誤處理:流可能需要額外的錯(cuò)誤處理,因?yàn)樵诹魇絺鬏斊陂g可能會(huì)發(fā)生網(wǎng)絡(luò)中斷或文件損壞。

  • No Re-reading without Seeking:處理流后,如果不使用 Seek 方法,通常無(wú)法返回到前面的點(diǎn),并非所有流都支持該方法。

可視化流 ??

理解流的一個(gè)有用類比是將它們視為允許數(shù)據(jù)連續(xù)流動(dòng)的水龍頭。就像廚房水龍頭一樣,流量可以是慢的也可以是快的,具體取決于情況。有些流可能會(huì)很快完成,而其他流可能需要更長(zhǎng)的時(shí)間。

在這個(gè)類比中,緩沖區(qū)的作用類似于一個(gè)桶。它會(huì)在數(shù)據(jù)流動(dòng)時(shí)捕獲數(shù)據(jù),以便您訪問(wèn)和處理數(shù)據(jù)。如果水龍頭 (流) 中斷,緩沖區(qū)將保留到目前為止已收集的內(nèi)容。這有助于說(shuō)明數(shù)據(jù)流的概念以及緩沖區(qū)如何管理信息流。

另一個(gè)重要方面是知道當(dāng)緩沖區(qū)已滿時(shí)從何處恢復(fù)讀取數(shù)據(jù)。如果無(wú)法記住我們?cè)谀睦锿V梗覀兙陀锌赡茉俅巫x取相同的數(shù)據(jù)或跳過(guò)某些部分。流的游標(biāo)扮演此角色;在這個(gè)類比中,您可以將光標(biāo)視為水龍頭的閥門。它控制水流,允許您根據(jù)需要停止和啟動(dòng)溪流,確保您可以繼續(xù)裝滿桶而不會(huì)損失一滴水。移動(dòng)光標(biāo)的過(guò)程稱為 seek

在 C# ?? 中使用 Stream 讀取文件內(nèi)容

下面是使用 C# 中的 FileStream 類從文件中讀取數(shù)據(jù)的示例。_FileStream_ 類繼承自抽象 Stream 類,該類提供用于處理流的方法。

using (FileStream stream = new FileStream(filePath, FileMode.Open, FileAccess.Read))
{
 byte[] buffer = new byte[1024];
 int bytesRead;

 while((bytesRead = await stream.ReadAsync(buffer, 0, buffer.Lenght)) > 0)
 {
   string content = Encoding.UTF8.GetString(buffer, 0, bytesRead);
   Console.WriteLine(content);
 }
}

在此示例中,我們使用緩沖區(qū)(一個(gè)字節(jié)數(shù)組)異步從文件中讀取數(shù)據(jù)。數(shù)據(jù)根據(jù)緩沖區(qū)的容量部分流入緩沖區(qū),_while_ 循環(huán)繼續(xù)重新填充緩沖區(qū),直到讀取整個(gè)流。_Stream_ 類的 Position 屬性跟蹤光標(biāo)在流中的最后讀取位置,以便我們可以確保可以讀取所有數(shù)據(jù)。

這里我們使用 Encoding.UTF8.GetString(buffer, 0, bytesRead) 將字節(jié)信息轉(zhuǎn)換為字符串,但我們可以處理任何時(shí)間的信息,因?yàn)槲覀儗⑵渥鳛樽止?jié)數(shù)組。

最后,我們將在控制臺(tái)上打印每次執(zhí)行 while 循環(huán)的字符串內(nèi)容。因此,即使文件尚未讀取,我們也會(huì)將內(nèi)容打印到屏幕中。

處理流位置和沖洗 ??

如果需要重置流的位置,可以檢查 CanSeek 是否_為 true_。如果是這樣,您可以使用 Seek 倒回開(kāi)頭:

if (stream.CanSeek)  
{  
 stream.Seek(0, SeekOrigin.Begin);  
}

使用可寫流時(shí),請(qǐng)使用 Flush 確保所有緩沖數(shù)據(jù)都寫入底層存儲(chǔ)或傳輸?shù)侥繕?biāo)。這對(duì)于避免數(shù)據(jù)丟失至關(guān)重要:

using (FileStream stream = new FileStream(filePath, FileMode.OpenOrCreate, FileAccess.Write))
{
   byte[] dataBytes = Encoding.UTF8.GetBytes(data);

   stream.Write(dataBytes, 0, dataBytes.Length);

   stream.Flush(); // Ensure all data is written to disk or transmitted
}

流生命周期 ?

流的生命周期包括幾個(gè)關(guān)鍵階段:創(chuàng)建、使用(讀取、寫入、查找)和處置。正確了解和管理每個(gè)階段對(duì)于高效且無(wú)差錯(cuò)的流操作至關(guān)重要。

  1. 創(chuàng)建:打開(kāi)數(shù)據(jù)源(例如文件、內(nèi)存或網(wǎng)絡(luò)連接)時(shí),將實(shí)例化流。例如,a 打開(kāi)文件進(jìn)行讀取或?qū)懭耄?a 使用內(nèi)存作為其數(shù)據(jù)源。實(shí)例化期間的配置參數(shù)(如文件路徑、訪問(wèn)模式和緩沖區(qū)大小)設(shè)置流的行為和性能特征。FileStreamMemoryStream

  2. 使用情況:在使用階段,數(shù)據(jù)使用讀取、寫入和有時(shí)查找操作流經(jīng)流。這些操作與底層數(shù)據(jù)源交互,以塊的形式處理數(shù)據(jù),而不是一次處理所有數(shù)據(jù),這對(duì)于大型數(shù)據(jù)集或?qū)崟r(shí)處理特別有用。每個(gè)操作都可能影響流的位置,由內(nèi)部游標(biāo)跟蹤,并且需要仔細(xì)管理以避免錯(cuò)誤,例如讀取超過(guò)流的末尾或在錯(cuò)誤的位置寫入。

  3. 刷新:對(duì)于可寫流,尤其是涉及緩沖的流,請(qǐng)務(wù)必確保在流關(guān)閉之前將緩沖區(qū)中的所有數(shù)據(jù)推送到底層數(shù)據(jù)源。這是使用該方法完成的,該方法將任何剩余的緩沖數(shù)據(jù)寫入其最終目標(biāo),從而防止數(shù)據(jù)丟失。Flush

  4. Disposal:正確處理流對(duì)于釋放系統(tǒng)資源(如文件句柄、網(wǎng)絡(luò)連接或內(nèi)存緩沖區(qū))至關(guān)重要。流實(shí)現(xiàn)接口,這意味著它們可以而且應(yīng)該使用方法或更常見(jiàn)的語(yǔ)句來(lái)處理。Disposal 可確保正確關(guān)閉和清理所有打開(kāi)的資源,從而防止可能影響系統(tǒng)穩(wěn)定性和性能的內(nèi)存泄漏或文件鎖定。IDisposableDisposeusing

  5. 錯(cuò)誤處理和完成:流在其生命周期中可能會(huì)遇到各種錯(cuò)誤,例如文件訪問(wèn)問(wèn)題、網(wǎng)絡(luò)超時(shí)或數(shù)據(jù)損壞。在流操作周圍使用 try-catch 塊實(shí)現(xiàn)可靠的錯(cuò)誤處理可確保您的應(yīng)用程序能夠正常處理這些情況。如果發(fā)生錯(cuò)誤,正確處理流可確保資源不會(huì)懸空,即使在故障情況下也是如此。

管理流生命周期的最佳實(shí)踐:

  • 使用流時(shí)始終使用語(yǔ)句。一旦退出代碼塊,它就會(huì)自動(dòng)處理流,即使在出現(xiàn)異常的情況下也是如此。using

using (var stream = new FileStream(filePath, FileMode.Open, FileAccess.Read))   
{      
 // Perform read operations }  
 // Stream is automatically disposed here  
}
  • 寫入時(shí)定期調(diào)用,以確保傳輸或保存所有緩沖數(shù)據(jù),尤其是在處理流之前。Flush

  • 在執(zhí)行操作之前檢查 、 和 等屬性,以確保流支持所需的操作。CanReadCanWriteCanSeek

  • 在處理大量數(shù)據(jù)或執(zhí)行可能阻塞的操作(例如,從慢速網(wǎng)絡(luò)連接讀取)時(shí),請(qǐng)使用異步方法 (, )。ReadAsyncWriteAsync

using (FileStream stream = new FileStream(filePath, FileMode.Open, FileAccess.Read))
       {
           // Check if the stream supports reading
           if (stream.CanRead)
           {
               byte[] buffer = new byte[1024]; // Buffer to hold read bytes
               int bytesRead;

               // Read the data from the stream asynchronously
               while ((bytesRead = stream.Read(buffer, 0, buffer.Length)) > 0)
               {
                   // Convert bytes to string and display
                   string content = System.Text.Encoding.UTF8.GetString(buffer, 0, bytesRead);
                   Console.WriteLine(content);
               }
           }
           else
           {
               Console.WriteLine("The stream does not support reading.");
           }
       } // The stream is automatically closed and disposed of here
  • 實(shí)施錯(cuò)誤處理以管理異常,確保在讀取或?qū)懭氩僮髌陂g發(fā)生錯(cuò)誤時(shí)正確關(guān)閉流。IOException

通過(guò)仔細(xì)管理流生命周期并遵循這些最佳實(shí)踐,您可以確保您的應(yīng)用程序高效處理數(shù)據(jù)、最大限度地減少資源使用并保持系統(tǒng)穩(wěn)定性。

C# ?? 中不同類型的流

雖然此示例使用 _FileStream_,但 C# 提供了各種流實(shí)現(xiàn),包括:

  • 內(nèi)存流: 將數(shù)據(jù)存儲(chǔ)在內(nèi)存中,對(duì)于臨時(shí)存儲(chǔ)和不需要磁盤寫入的操作非常有用。

  • _NetworkStream_:允許通過(guò)網(wǎng)絡(luò)傳輸數(shù)據(jù),通常用于 TCP/IP 連接。

  • _CryptoStream_:應(yīng)用加密轉(zhuǎn)換以實(shí)現(xiàn)安全的數(shù)據(jù)處理,對(duì)加密和解密非常有用。

  • _BufferedStream_:為另一個(gè)流添加緩沖,增強(qiáng)重復(fù)讀/寫操作的性能。

  • _GZipStream_:使用 GZip 算法壓縮或解壓縮數(shù)據(jù),非常適合減少存儲(chǔ)空間和傳輸時(shí)間。

每種流類型都有獨(dú)特的特性,使其適用于 C# 應(yīng)用程序中的不同場(chǎng)景。選擇流時(shí),請(qǐng)考慮數(shù)據(jù)源、性能要求以及是否需要查找等因素。

流是 C# 中一種基本的通用工具,可為大規(guī)模 I/O 操作(如文件處理、網(wǎng)絡(luò)通信和實(shí)時(shí)數(shù)據(jù)處理)實(shí)現(xiàn)高效的數(shù)據(jù)處理。通過(guò)掌握流使用的復(fù)雜性,包括性能優(yōu)化、有效的錯(cuò)誤處理和適當(dāng)?shù)纳芷诠芾恚_(kāi)發(fā)人員可以最大限度地利用流的優(yōu)勢(shì)來(lái)構(gòu)建響應(yīng)迅速、資源高效且可擴(kuò)展的應(yīng)用程序。


該文章在 2024/10/30 15:09:51 編輯過(guò)
關(guān)鍵字查詢
相關(guān)文章
正在查詢...
點(diǎn)晴ERP是一款針對(duì)中小制造業(yè)的專業(yè)生產(chǎn)管理軟件系統(tǒng),系統(tǒng)成熟度和易用性得到了國(guó)內(nèi)大量中小企業(yè)的青睞。
點(diǎn)晴PMS碼頭管理系統(tǒng)主要針對(duì)港口碼頭集裝箱與散貨日常運(yùn)作、調(diào)度、堆場(chǎng)、車隊(duì)、財(cái)務(wù)費(fèi)用、相關(guān)報(bào)表等業(yè)務(wù)管理,結(jié)合碼頭的業(yè)務(wù)特點(diǎn),圍繞調(diào)度、堆場(chǎng)作業(yè)而開(kāi)發(fā)的。集技術(shù)的先進(jìn)性、管理的有效性于一體,是物流碼頭及其他港口類企業(yè)的高效ERP管理信息系統(tǒng)。
點(diǎn)晴WMS倉(cāng)儲(chǔ)管理系統(tǒng)提供了貨物產(chǎn)品管理,銷售管理,采購(gòu)管理,倉(cāng)儲(chǔ)管理,倉(cāng)庫(kù)管理,保質(zhì)期管理,貨位管理,庫(kù)位管理,生產(chǎn)管理,WMS管理系統(tǒng),標(biāo)簽打印,條形碼,二維碼管理,批號(hào)管理軟件。
點(diǎn)晴免費(fèi)OA是一款軟件和通用服務(wù)都免費(fèi),不限功能、不限時(shí)間、不限用戶的免費(fèi)OA協(xié)同辦公管理系統(tǒng)。
Copyright 2010-2025 ClickSun All Rights Reserved

黄频国产免费高清视频,久久不卡精品中文字幕一区,激情五月天AV电影在线观看,欧美国产韩国日本一区二区
婷婷久久人人爽人人爽 | 亚洲国产精品91 | 精品久久精品老人网 | 中文字幕人成乱码熟女免费 | 亚洲中文AⅤ中文字幕在线 小草在线影院婷婷亚洲 | 亚洲国产日韩欧美一区二区三区 |