Stream 类
定义
重要
一些信息与预发行产品相关,相应产品在发行之前可能会进行重大修改。 对于此处提供的信息,Microsoft 不作任何明示或暗示的担保。
提供字节序列的泛型视图。 这是一个抽象类。
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 的一些较常用流是 FileStream,MemoryStream。
流可能仅支持其中一些功能,具体取决于基础数据源或存储库。 可以使用 Stream 类的 CanRead、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 线程,并使你的应用看起来好像不起作用一样。 异步方法与 Visual Basic 和 C# 中的 async
和 await
关键字结合使用。
在 Windows 8.x 应用商店应用中使用时,Stream 包括两种扩展方法:AsInputStream 和 AsOutputStream。 这些方法将 Stream 对象转换为 Windows 运行时中的流。 还可以使用 AsStreamForRead 和 AsStreamForWrite 方法将 Windows 运行时中的流转换为 Stream 对象。 有关详细信息,请参阅 如何:在 .NET Framework 流和 Windows 运行时流之间转换
某些流实现执行基础数据的本地缓冲以提高性能。 对于此类流,可以使用 Flush 或 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派生时,我们建议重写这些方法以访问内部缓冲区(如果有)以获得更好的性能。 还必须提供 CanRead、CanSeek、CanWrite、Flush()、Length、Position、Seek(Int64, SeekOrigin)和 SetLength(Int64)的实现。
不要替代 Close() 方法,而是将所有 Stream 清理逻辑放在 Dispose(Boolean) 方法中。 有关详细信息,请参阅 实现 Dispose 方法。
构造函数
Stream() |
初始化 Stream 类的新实例。 |
字段
Null |
没有后盾存储的 |
属性
CanRead |
在派生类中重写时,获取一个值,该值指示当前流是否支持读取。 |
CanSeek |
在派生类中重写时,获取一个值,该值指示当前流是否支持查找。 |
CanTimeout |
获取一个值,该值确定当前流是否可以超时。 |
CanWrite |
在派生类中重写时,获取一个值,该值指示当前流是否支持写入。 |
Length |
在派生类中重写时,获取流的长度(以字节为单位)。 |
Position |
在派生类中重写时,获取或设置当前流中的位置。 |
ReadTimeout |
获取或设置一个值(以毫秒为单位),该值确定流在超时前尝试读取的时间。 |
WriteTimeout |
获取或设置一个值(以毫秒为单位),该值确定流在超时之前尝试写入的时间。 |
方法
显式接口实现
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。 |