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 类。 请注意,Button 控件的 Click 事件处理程序使用 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 类及其派生类提供了这些不同类型的输入和输出的泛型视图,并将程序员与操作系统和基础设备的特定详细信息隔离开来。

流涉及三个基本操作:

  • 可以从流中读取。 读取是将数据从流传输到数据结构,例如字节数组。

  • 可以写入流。 写入是将数据从数据结构传输到流中。

  • 流可以支持寻求。 查找是指查询和修改流中的当前位置。 查找功能取决于流的支持存储类型。 例如,网络流没有统一的当前位置概念,因此通常不支持寻求。

继承自 Stream 的一些较常用流是 FileStreamMemoryStream

流可能仅支持其中一些功能,具体取决于基础数据源或存储库。 可以使用 Stream 类的 CanReadCanWriteCanSeek 属性来查询流的功能。

ReadWrite 方法以各种格式读取和写入数据。 对于支持查找的流,请使用 SeekSetLength 方法和 PositionLength 属性来查询和修改流的当前位置和长度。

此类型实现 IDisposable 接口。 使用完该类型后,应直接或间接释放它。 若要直接释放类型,请在 try/catch 块中调用其 Dispose 方法。 若要间接处理它,请使用语言构造(如 using(在 C# 中)或 Using(在 Visual Basic 中)。 有关详细信息,请参阅 IDisposable 接口主题中的“使用实现 IDisposable 的对象”部分。

释放 Stream 对象会刷新任何缓冲数据,并实质上调用 Flush 方法。 Dispose 还会释放操作系统资源,例如文件句柄、网络连接或用于任何内部缓冲的内存。 BufferedStream 类提供将缓冲流环绕另一个流的功能,以提高读取和写入性能。

从 .NET Framework 4.5 开始,Stream 类包括用于简化异步操作的异步方法。 异步方法在其名称中包含 Async,例如 ReadAsyncWriteAsyncCopyToAsyncFlushAsync。 通过这些方法,无需阻止主线程即可执行资源密集型 I/O 操作。 在 Windows 8.x 应用商店应用或桌面应用中,这种性能注意事项尤其重要,其中耗时的流操作可能会阻止 UI 线程,并使你的应用看起来好像不起作用一样。 异步方法与 Visual Basic 和 C# 中的 asyncawait 关键字结合使用。

在 Windows 8.x 应用商店应用中使用时,Stream 包括两种扩展方法:AsInputStreamAsOutputStream。 这些方法将 Stream 对象转换为 Windows 运行时中的流。 还可以使用 AsStreamForReadAsStreamForWrite 方法将 Windows 运行时中的流转换为 Stream 对象。 有关详细信息,请参阅 如何:在 .NET Framework 流和 Windows 运行时流之间转换

某些流实现执行基础数据的本地缓冲以提高性能。 对于此类流,可以使用 FlushFlushAsync 方法清除任何内部缓冲区,并确保所有数据都已写入基础数据源或存储库。

如果需要没有后备存储(也称为位存储桶)的流,请使用 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) 方法中。 有关详细信息,请参阅 实现 Dispose 方法

构造函数

Stream()

初始化 Stream 类的新实例。

字段

Null

没有后盾存储的 Stream

属性

CanRead

在派生类中重写时,获取一个值,该值指示当前流是否支持读取。

CanSeek

在派生类中重写时,获取一个值,该值指示当前流是否支持查找。

CanTimeout

获取一个值,该值确定当前流是否可以超时。

CanWrite

在派生类中重写时,获取一个值,该值指示当前流是否支持写入。

Length

在派生类中重写时,获取流的长度(以字节为单位)。

Position

在派生类中重写时,获取或设置当前流中的位置。

ReadTimeout

获取或设置一个值(以毫秒为单位),该值确定流在超时前尝试读取的时间。

WriteTimeout

获取或设置一个值(以毫秒为单位),该值确定流在超时之前尝试写入的时间。

方法

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

开始异步读取操作。 (请考虑改用 ReadAsync(Byte[], Int32, Int32)

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

开始异步写入操作。 (请考虑改用 WriteAsync(Byte[], Int32, Int32)

Close()

关闭当前流并释放与当前流关联的任何资源(如套接字和文件句柄)。 请确保流已正确释放,而不是调用此方法。

CopyTo(Stream)

从当前流中读取字节并将其写入另一个流。 这两个流位置都是按复制的字节数进行高级的。

CopyTo(Stream, Int32)

从当前流中读取字节,并使用指定的缓冲区大小将其写入另一个流。 这两个流位置都是按复制的字节数进行高级的。

CopyToAsync(Stream)

从当前流异步读取字节并将其写入另一个流。 这两个流位置都是按复制的字节数进行高级的。

CopyToAsync(Stream, CancellationToken)

使用指定的取消标记异步读取当前流中的字节并将其写入另一个流。 这两个流位置都是按复制的字节数进行高级的。

CopyToAsync(Stream, Int32)

使用指定的缓冲区大小异步读取当前流中的字节并将其写入另一个流。 这两个流位置都是按复制的字节数进行高级的。

CopyToAsync(Stream, Int32, CancellationToken)

使用指定的缓冲区大小和取消令牌异步读取当前流中的字节并将其写入另一个流。 这两个流位置都是按复制的字节数进行高级的。

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)

从当前流异步读取字节序列,并通过读取的字节数推进流中的位置。

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

从当前流异步读取字节序列,按读取的字节数推进流中的位置,并监视取消请求。

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)CopyToAsync(Stream, Int32, CancellationToken) 方法的参数。

Write(Byte[], Int32, Int32)

在派生类中重写时,将字节序列写入当前流,并通过写入的字节数推进此流中的当前位置。

Write(ReadOnlySpan<Byte>)

在派生类中重写时,将字节序列写入当前流,并通过写入的字节数推进此流中的当前位置。

WriteAsync(Byte[], Int32, Int32)

以异步方式将字节序列写入当前流,并通过写入的字节数推进此流中的当前位置。

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

将字节序列异步写入当前流,按写入的字节数推进此流中的当前位置,并监视取消请求。

WriteAsync(ReadOnlyMemory<Byte>, CancellationToken)

将字节序列异步写入当前流,按写入的字节数推进此流中的当前位置,并监视取消请求。

WriteByte(Byte)

将字节写入流中的当前位置,并将流中的位置向前推进一个字节。

显式接口实现

IDisposable.Dispose()

释放 Stream使用的所有资源。

扩展方法

CopyToAsync(Stream, PipeWriter, CancellationToken)

使用取消令牌从 Stream 异步读取字节并将其写入指定的 PipeWriter

AsInputStream(Stream)

将适用于 Windows 应用商店应用的 .NET 中的托管流转换为 Windows 运行时中的输入流。

AsOutputStream(Stream)

将适用于 Windows 应用商店应用的 .NET 中的托管流转换为 Windows 运行时中的输出流。

AsRandomAccessStream(Stream)

将指定的流转换为随机访问流。

ConfigureAwait(IAsyncDisposable, Boolean)

配置如何执行从异步可释放项返回的任务的 await。

适用于

另请参阅