解釋 .NET 中的流體系結構


.NET 流體系結構提供了一個一致的程式設計介面,用於跨不同 I/O 型別進行讀寫操作。它包括用於操作磁碟上的檔案和目錄的類,以及用於壓縮、命名管道和記憶體對映檔案的專用流。

.NET 中的流體系結構依賴於後端儲存和介面卡。

後端儲存

它表示資料儲存,例如檔案或網路連線。它可以充當可以順序讀取位元組的源,也可以充當可以順序寫入位元組的目標。

.NET 中的 Stream 類將後端儲存公開給程式設計師。它公開了用於讀取、寫入和定位的方法。顧名思義,流是流動的資料,可以是每次一個位元組,也可以是特定大小的塊。資料不會像陣列一樣一次全部駐留在記憶體中。流使用的記憶體量很少,而不管原始資料儲存的大小如何。

介面卡

通常,流處理位元組。雖然位元組靈活且高效,但應用程式使用更高級別的抽象。諸如 TextReader/TextWriter 或 XMLReader/XMLWriter 之類的介面卡包裝一個流並提供對更高級別資料結構(如文字字串和 XML)的訪問。

Stream 類

Stream 類定義在 System.IO 名稱空間中,並提供位元組序列的通用檢視。它是一個抽象類,充當所有流的基類。它公開了用於讀取、寫入和查詢操作的方法,以及其他管理功能,例如關閉和重新整理。

Stream 類具有以下成員:

屬性

  • CanRead – 如果當前流支援讀取,則返回 true。

  • CanSeek – 如果當前流支援查詢(即查詢和修改流中的當前位置),則返回 true。

  • CanTimeout – 如果當前流可以超時,則返回 true。

  • CanWrite – 如果當前流支援寫入,則返回 true。

  • Length – 返回流的長度(以位元組為單位)。

  • Position – 獲取或設定當前流中的位置。

  • Readtimeout – 獲取或設定一個值(以毫秒為單位),該值確定流在超時之前嘗試讀取的時間長度。

  • WriteTimeout – 獲取或設定一個值(以毫秒為單位),該值確定流在超時之前嘗試寫入的時間長度。

方法

public abstract int Read (byte[] buffer, int offset, int count)

在派生類中被重寫時,從當前流讀取位元組序列,並根據讀取的位元組數遞增流中的位置。

public abstract void Write (byte[] buffer, int offset, int count)

在派生類中被重寫時,將位元組序列寫入當前流,並根據寫入的位元組數遞增此流中的當前位置。

public abstract long Seek (long offset, System.IO.SeekOrigin origin);

在派生類中被重寫時,設定當前流中的位置。

public abstract void Flush ();

在派生類中被重寫時,清除此流的所有緩衝區,並導致任何緩衝資料寫入基礎裝置。

示例

這是一個演示 Stream 用法的完整示例。

線上演示

using System;
using System.IO;
class Program{
   static void Main(string[] args){
      // Create a file called test.txt in the current directory:
      using (Stream str = new FileStream("sample.txt", FileMode.Create)){
         Console.WriteLine(str.CanRead); // True
         Console.WriteLine(str.CanWrite); // True
         Console.WriteLine(str.CanSeek); // True

         str.WriteByte(75);
         str.WriteByte(76);
         byte[] bytes = { 10, 20, 30 };
         str.Write(bytes, 0, bytes.Length); // Write block of 5 bytes
         Console.WriteLine(str.Length); // 7
         Console.WriteLine(str.Position); // 7
         str.Position = 0; // Move back to the start
         Console.WriteLine(str.ReadByte()); // 101 Console.WriteLine(str.ReadByte()); // 102
     
         // Read from the stream back into the block array:
         Console.WriteLine(str.Read(bytes, 0, bytes.Length)); // 5
         // Assuming the last Read returned 5, we'll be at
         // the end of the file, so Read will now return 0:
         Console.WriteLine(str.Read(bytes, 0, bytes.Length)); // 0
      }
   }
}

輸出

True
True
True
5
5
75
76
3
0

更新於:2021年5月19日

414 次瀏覽

啟動您的職業生涯

完成課程獲得認證

開始學習
廣告
© . All rights reserved.