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
Object
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 End Sub End Class

Stream 是所有流的抽象基类。 流是字节序列的抽象,例如文件、输入/输出设备、进程中通信管道或 TCP/IP 套接字。 类 Stream 及其派生类提供这些不同类型的输入和输出的通用视图,并将程序员与操作系统和基础设备的特定详细信息隔离开来。

流涉及三个基本操作:

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

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

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

    继承自 Stream 的一些更常用的流包括 FileStream 、 和 MemoryStream

    根据基础数据源或存储库,流可能仅支持其中某些功能。 可以使用 类的 CanRead Stream CanWrite CanSeek 属性查询流的功能。

    Read Write 方法以各种格式读取和写入数据。 对于支持查找的流,请使用 Seek SetLength 方法以及 Position Length 属性来查询和修改流的当前位置和长度。

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

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

    从 .NET Framework 4.5 开始, Stream 类包括用于简化异步操作的异步方法。 异步方法 Async 的名称中包含 ,例如 ReadAsync WriteAsync CopyToAsync FlushAsync 。 这些方法使你能够在不阻止主线程的情况下执行资源密集型 I/O 操作。 在 Windows 8.x 应用商店应用或桌面应用中一个耗时的流操作可能阻塞 UI 线程并让应用看起来好像不工作时,这种性能的考虑就显得尤为重要了。 异步方法与 async Visual Basic 和 C# 中的 和 await 关键字结合使用。

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

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

    如果需要没有后备存储的流 (也称为位存储桶) ,请使用 Null 字段检索专为此目的设计的流的实例。

    实施者说明

    实现 的派生类 Stream 时,必须为 和 Write(Byte[], Int32, Int32) 方法提供实现 Read(Byte[], Int32, Int32) 。 异步方法 、 和 在其实现中使用同步方法和 Read(Byte[], Int32, Int32) Write(Byte[], Int32, Int32) CopyToAsync(Stream) WriteAsync(Byte[], Int32, Int32) ReadAsync(Byte[], Int32, Int32) 因此,和 Write(Byte[], Int32, Int32) Read(Byte[], Int32, Int32) 实现将正确使用异步方法。 和 的默认实现 ReadByte() 创建新的单元素字节数组,然后调用 和 Write(Byte[], Int32, Int32) Read(Byte[], Int32, Int32) 实现。 WriteByte(Byte) Stream 派生时,建议重写这些方法以访问内部缓冲区(如果有),以便大幅提高性能。 还必须提供 、、、 CanSeek Flush() CanWrite Length Position Seek(Int64, SeekOrigin) 和 的 CanRead SetLength(Int64) 实现。

    不要重写 Close() 方法,而是将所有 Stream 清理逻辑放在 方法中 Dispose(Boolean) 。 有关详细信息,请参阅 实现 Dispose 方法

  •