Stream 類別

定義

提供位元組序列的泛型檢視。 這是抽象類。

public ref class Stream abstract : IDisposable
public ref class Stream abstract : MarshalByRefObject, IAsyncDisposable, IDisposable
public ref class Stream abstract : MarshalByRefObject, IDisposable
public abstract class Stream : IDisposable
public abstract class Stream : MarshalByRefObject, IAsyncDisposable, IDisposable
public abstract class Stream : MarshalByRefObject, IDisposable
[System.Serializable]
public abstract class Stream : MarshalByRefObject, IDisposable
[System.Serializable]
[System.Runtime.InteropServices.ComVisible(true)]
public abstract class Stream : MarshalByRefObject, IDisposable
type Stream = class
    interface IDisposable
type Stream = class
    inherit MarshalByRefObject
    interface IAsyncDisposable
    interface IDisposable
type Stream = class
    inherit MarshalByRefObject
    interface IDisposable
[<System.Serializable>]
type Stream = class
    inherit MarshalByRefObject
    interface IDisposable
[<System.Serializable>]
[<System.Runtime.InteropServices.ComVisible(true)>]
type Stream = class
    inherit MarshalByRefObject
    interface IDisposable
Public MustInherit Class Stream
Implements IDisposable
Public MustInherit Class Stream
Inherits MarshalByRefObject
Implements IAsyncDisposable, IDisposable
Public MustInherit Class Stream
Inherits MarshalByRefObject
Implements IDisposable
繼承
Stream
繼承
衍生
屬性
實作

範例

以下範例示範如何利用兩個 FileStream 物件非同步地將檔案從一個目錄複製到另一個目錄。 類別 FileStream 衍生自 Stream 類別。 請注意, Click 控件的 Button 事件處理程式會以 async 修飾詞標示,因為它會呼叫異步方法。

using System;
using System.Threading.Tasks;
using System.Windows;
using System.IO;

namespace WpfApplication
{
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        private async void Button_Click(object sender, RoutedEventArgs e)
        {
            string StartDirectory = @"c:\Users\exampleuser\start";
            string EndDirectory = @"c:\Users\exampleuser\end";

            foreach (string filename in Directory.EnumerateFiles(StartDirectory))
            {
                using (FileStream SourceStream = File.Open(filename, FileMode.Open))
                {
                    using (FileStream DestinationStream = File.Create(EndDirectory + filename.Substring(filename.LastIndexOf('\\'))))
                    {
                        await SourceStream.CopyToAsync(DestinationStream);
                    }
                }
            }
        }
    }
}
Imports System.IO

Class MainWindow

    Private Async Sub Button_Click(sender As Object, e As RoutedEventArgs)
        Dim StartDirectory As String = "c:\Users\exampleuser\start"
        Dim EndDirectory As String = "c:\Users\exampleuser\end"

        For Each filename As String In Directory.EnumerateFiles(StartDirectory)
            Using SourceStream As FileStream = File.Open(filename, FileMode.Open)
                Using DestinationStream As FileStream = File.Create(EndDirectory + filename.Substring(filename.LastIndexOf("\"c)))
                    Await SourceStream.CopyToAsync(DestinationStream)
                End Using

            End Using
        Next
    End Sub

End Class

備註

Stream 是所有串流的抽象基底類別。 數據流是位元組序列的抽象概念,例如檔案、輸入/輸出裝置、進程間通訊管道或 TCP/IP 套接字。 這個 Stream 類別及其衍生類別提供了這些不同輸入與輸出類型的通用視圖,並將程式設計師與作業系統及底層裝置的具體細節隔離開來。

串流涉及三個基本操作:

  • 您可以從數據流讀取。 讀取是將數據從數據流傳輸到數據結構,例如位元組陣列。

  • 您可以寫入資料流。 寫入是將數據從數據結構傳輸到數據流。

  • 串流可以支持搜尋。 搜尋是指查詢和修改數據流中目前的位置。 搜尋功能取決於數據流擁有的備份儲存區類型。 例如,網路數據流沒有目前位置的統一概念,因此通常不支持搜尋。

一些較常用的繼承 流 StreamFileStreamMemoryStream和 。

視基礎數據源或存放庫而定,數據流可能只支援其中一些功能。 你可以利用CanRead類別的 CanWrite 、 、 CanSeekStream 和 屬性來查詢串流的能力。

ReadWrite方法以多種格式讀寫資料。 對於支援尋址的串流,請使用 Seek and SetLength 方法和 and PositionLength 屬性來查詢並修改串流目前的位置與長度。

此類型會實作 IDisposable 介面。 當你用完型別後,應該直接(呼叫其 Dispose 方法)或間接(用語言結構,例如 using C# 中)處理它。 欲了解更多資訊,請參閱 「使用實作 IDisposable 的物件」。

丟棄 Stream 物件會清除所有緩衝資料,基本上是幫你呼叫這個 Flush 方法。 Dispose 同時也會釋放作業系統資源,例如檔案處理器、網路連線,或用於任何內部緩衝的記憶體。 此 BufferedStream 類別提供將緩衝串流包裹於另一串流以提升讀寫效能的能力。

從 .NET Framework 4.5 開始,該 Stream 類別包含非同步方法以簡化非同步操作。 非同步方法名稱中包含 Async ,例如 ReadAsyncWriteAsyncCopyToAsyncFlushAsync。 這些方法可讓您執行耗用大量資源的 I/O 作業,而不會封鎖主要線程。 在 Windows 8.x 市集應用程式或傳統型應用程式中,此效能考慮特別重要,其中耗時的串流作業可能會封鎖 UI 線程,並讓應用程式看起來好像無法運作。 非同步方法與 asyncawait 關鍵字搭配使用 Visual Basic 和 C# 中。

當用於 Windows 8.x 商店應用程式時,包含 Stream 兩種擴充方法: AsInputStreamAsOutputStream。 這些方法將物件轉換 Stream 成 Windows 執行時的串流。 你也可以在 Stream Windows 執行時使用和AsStreamForRead方法,將串流轉換成AsStreamForWrite物件。 欲了解更多資訊,請參閱 《如何:在 .NET Framework 串流與 Windows 執行環境串流間轉換

某些數據流實作會執行基礎數據的本機緩衝,以改善效能。 對於這類資料流,你可以使用 Flush or FlushAsync 方法清除所有內部緩衝區,並確保所有資料都已寫入底層資料來源或儲存庫。

如果你需要一個沒有後備儲存的串流(也稱為位元桶),可以使用欄位 Null 來擷取專為此目的設計的串流實例。

給實施者的注意事項

當你實作導Stream出類別時,必須提供 和 Read(Byte[], Int32, Int32) 方法的實作Write(Byte[], Int32, Int32)。 非同步方法ReadAsync(Byte[], Int32, Int32)、、、WriteAsync(Byte[], Int32, Int32)並使用同步方法CopyToAsync(Stream)及其Read(Byte[], Int32, Int32)實作。 Write(Byte[], Int32, Int32) 因此,你的 和 Read(Byte[], Int32, Int32)Write(Byte[], Int32, Int32) 實作會與非同步方法正常運作。 預設的 和 實作ReadByte()WriteByte(Byte)建立一個新的單元素位元組陣列,然後呼叫你的實作 Read(Byte[], Int32, Int32)Write(Byte[], Int32, Int32)和 。 當你從 推導出 Stream時,我們建議你覆寫這些方法來存取你的內部緩衝區(如果有的話),以大幅提升效能。 你還必須提供 、 CanReadCanSeekCanWriteFlush()LengthPositionSeek(Int64, SeekOrigin)的實作。SetLength(Int64)

不要覆寫方法, Close() 而是把所有 Stream 清理邏輯都放進方法裡 Dispose(Boolean) 。 欲了解更多資訊,請參閱 「實施處置方法」。

建構函式

名稱 Description
Stream()

初始化 Stream 類別的新執行個體。

欄位

名稱 Description
Null

Stream A,沒有後備商店。

屬性

名稱 Description
CanRead

在衍生類別中覆寫時,取得值,指出目前數據流是否支援讀取。

CanSeek

在衍生類別中覆寫時,取得值,指出目前數據流是否支持搜尋。

CanTimeout

取得值,這個值會判斷目前的數據流是否可以逾時。

CanWrite

在衍生類別中覆寫時,取得值,指出目前數據流是否支援寫入。

Length

在衍生類別中覆寫時,取得數據流的位元組長度。

Position

當在派生類別中被覆寫時,會取得或設定目前串流中的位置。

ReadTimeout

會取得或設定一個以毫秒為單位的值,決定串流在逾時前嘗試讀取的時間長短。

WriteTimeout

取得或設定一個毫秒級的值,決定串流在逾時前嘗試寫入的時間長短。

方法

名稱 Description
BeginRead(Byte[], Int32, Int32, AsyncCallback, Object)

開始異步讀取作業。 (考慮改用 ReadAsync(Byte[], Int32, Int32) 。)

BeginWrite(Byte[], Int32, Int32, AsyncCallback, Object)

開始異步寫入作業。 (考慮改用 WriteAsync(Byte[], Int32, Int32) 。)

Close()

關閉目前串流並釋放與目前串流相關的資源(如套接字和檔案柄)。 與其呼叫此方法,不如確保溪流已被妥善處理。

CopyTo(Stream, Int32)

從目前串流讀取位元組,並依指定緩衝區大小寫入另一串流。 兩個串流的位置依複製的位元組數前進。

CopyTo(Stream)

從目前串流讀取位元組,然後寫入另一條串流。 兩個串流的位置依複製的位元組數前進。

CopyToAsync(Stream, CancellationToken)

使用指定的取消標記,以異步方式從目前數據流讀取位元組,並將其寫入另一個數據流。 兩個串流的位置依複製的位元組數前進。

CopyToAsync(Stream, Int32, CancellationToken)

非同步地從目前串流讀取位元組,並使用指定的緩衝區大小與取消標記寫入另一串流。 兩個串流的位置依複製的位元組數前進。

CopyToAsync(Stream, Int32)

非同步讀取目前串流的位元組,並以指定的緩衝區大小寫入另一串流。 兩個串流的位置依複製的位元組數前進。

CopyToAsync(Stream)

非同步地從目前串流讀取位元組,然後寫入另一條串流。 兩個串流的位置依複製的位元組數前進。

CreateObjRef(Type)

建立一個物件,包含產生代理伺服器所需的所有相關資訊,用於與遠端物件通訊。

(繼承來源 MarshalByRefObject)
CreateWaitHandle()
已淘汰.
已淘汰.
已淘汰.

分配一個 WaitHandle 物件。

Dispose()

釋放 Stream所使用的所有資源。

Dispose(Boolean)

釋放 未管理的資源, Stream 並可選擇性地釋放受管理資源。

DisposeAsync()

非同步釋放 Stream.

EndRead(IAsyncResult)

等候暫止的異步讀取完成。 (考慮改用 ReadAsync(Byte[], Int32, Int32) 。)

EndWrite(IAsyncResult)

結束異步寫入作業。 (考慮改用 WriteAsync(Byte[], Int32, Int32) 。)

Equals(Object)

判斷指定的物件是否等於目前的物件。

(繼承來源 Object)
Flush()

在衍生類別中覆寫時,清除此數據流的所有緩衝區,並導致任何緩衝的數據寫入基礎裝置。

FlushAsync()

非同步清除此串流的所有緩衝區,並使任何緩衝資料寫入底層裝置。

FlushAsync(CancellationToken)

非同步清除此串流的所有緩衝區,導致任何緩衝資料寫入底層裝置,並監控取消請求。

GetHashCode()

做為預設哈希函式。

(繼承來源 Object)
GetLifetimeService()
已淘汰.

擷取控制這個實例存留期原則的目前存留期服務物件。

(繼承來源 MarshalByRefObject)
GetType()

取得目前實例的 Type

(繼承來源 Object)
InitializeLifetimeService()
已淘汰.

取得存留期服務物件,以控制這個實例的存留期原則。

(繼承來源 MarshalByRefObject)
MemberwiseClone()

建立目前 Object的淺層複本。

(繼承來源 Object)
MemberwiseClone(Boolean)

建立目前 MarshalByRefObject 對象的淺層複本。

(繼承來源 MarshalByRefObject)
ObjectInvariant()
已淘汰.

提供 。Contract

Read(Byte[], Int32, Int32)

在衍生類別中覆寫時,從目前數據流讀取位元組序列,並將數據流中的位置依讀取的位元組數目往前移。

Read(Span<Byte>)

在衍生類別中覆寫時,從目前數據流讀取位元組序列,並將數據流中的位置依讀取的位元組數目往前移。

ReadAsync(Byte[], Int32, Int32, CancellationToken)

非同步讀取目前串流的位元組序列,依讀取位元組數前進串流中的位置,並監控取消請求。

ReadAsync(Byte[], Int32, Int32)

非同步讀取當前串流的位元組序列,並依讀取位元組數推進串流中的位置。

ReadAsync(Memory<Byte>, CancellationToken)

非同步讀取目前串流的位元組序列,依讀取位元組數前進串流中的位置,並監控取消請求。

ReadAtLeast(Span<Byte>, Int32, Boolean)

從目前數據流讀取至少一個字節數目,並將數據流中的位置依讀取的位元組數目往前移。

ReadAtLeastAsync(Memory<Byte>, Int32, Boolean, CancellationToken)

以異步方式從目前數據流讀取至少一個字節數目、依讀取的位元組數目將數據流中的位置往前移,並監視取消要求。

ReadByte()

從串流讀取一個位元組,並將串流中的位置往前推進一個位元組,若在串流末端則返回 -1。

ReadExactly(Byte[], Int32, Int32)

從目前串流讀取 count 位元組數,並推進串流中的位置。

ReadExactly(Span<Byte>)

從目前串流讀取位元組,並推進串流中的位置直到填 buffer 滿。

ReadExactlyAsync(Byte[], Int32, Int32, CancellationToken)

非同步讀取 count 當前串流的位元組數量,推進串流中的位置,並監控取消請求。

ReadExactlyAsync(Memory<Byte>, CancellationToken)

非同步讀取目前串流的位元組,推進串流中的位置直到填 buffer 滿,並監控取消請求。

Seek(Int64, SeekOrigin)

在衍生類別中覆寫時,設定目前數據流中的位置。

SetLength(Int64)

當在派生類別中覆寫時,會設定目前串流的長度。

Synchronized(Stream)

建立一個執行緒安全(同步)的包裝器,包圍指定 Stream 物件。

ToString()

傳回表示目前 物件的字串。

(繼承來源 Object)
ValidateBufferArguments(Byte[], Int32, Int32)

驗證提供給讀取與寫入方法的 Stream參數。

ValidateCopyToArguments(Stream, Int32)

驗證提供給 CopyTo(Stream, Int32) OR CopyToAsync(Stream, Int32, CancellationToken) 方法的參數。

Write(Byte[], Int32, Int32)

在衍生類別中覆寫時,將位元組序列寫入目前數據流,並依寫入的位元組數目將這個數據流中的目前位置往前移。

Write(ReadOnlySpan<Byte>)

在衍生類別中覆寫時,將位元組序列寫入目前數據流,並依寫入的位元組數目將這個數據流中的目前位置往前移。

WriteAsync(Byte[], Int32, Int32, CancellationToken)

非同步地將一串位元組寫入目前串流,依照寫入位元組數將該串流中的當前位置前進,並監控取消請求。

WriteAsync(Byte[], Int32, Int32)

非同步地將一串位元組寫入目前串流,並依照寫入的位元組數將該串流中的當前位置往前推進。

WriteAsync(ReadOnlyMemory<Byte>, CancellationToken)

非同步地將一串位元組寫入目前串流,依照寫入位元組數將該串流中的當前位置前進,並監控取消請求。

WriteByte(Byte)

將位元組寫入數據流中的目前位置,並將數據流中的位置往前移一個字節。

明確介面實作

名稱 Description
IDisposable.Dispose()

釋放 Stream所使用的所有資源。

擴充方法

名稱 Description
AsInputStream(Stream)

將適用於 Windows 市集應用程式的 .NET 中的 Managed 資料流轉換為 Windows 執行時間中的輸入資料流。

AsOutputStream(Stream)

將適用於 Windows 市集應用程式的 .NET 中的 Managed 資料流轉換為 Windows 執行時間中的輸出資料流。

AsRandomAccessStream(Stream)

將指定的數據流轉換為隨機存取數據流。

ConfigureAwait(IAsyncDisposable, Boolean)

設定如何執行從異步可處置專案傳回的工作等候。

CopyToAsync(Stream, PipeWriter, CancellationToken)

非同步讀取 的 Stream 位元組並使用消去標記寫入指定的 PipeWriter

適用於

另請參閱