流是对字节序列的抽象。你可以把它想象成一个连续的缓冲区,可以读或写。流通常与缓冲区一起使用,以帮助更有效地将数据加载到内存中。这个系统。. net中的IO命名空间有许多处理流的类,例如FileStream、MemoryStream、FileInfo和StreamReader/Writer类。
基本上,流分为字节流和字符流,其中字节流处理以字节表示的数据,字符流处理字符。在。net中,字节流包括Stream、FileStream、MemoryStream和BufferedStream类。. net字符流包括TextReader、TextWriter、StreamReader和StreamWriter。
本文演示了c#中BufferedStream和MemoryStream类的使用,并提供了适用的相关代码示例。要使用本文中提供的代码示例,您应该在系统中安装Visual Studio 2022。如果你还没有副本,也可以点击此处下载Visual Studio 2022.
在Visual Studio中创建控制台应用程序项目
首先,让我们在Visual Studio中创建一个. net Core控制台应用程序项目。假设您的系统中已经安装了Visual Studio 2022,请按照下面概述的步骤在Visual Studio中创建一个新的. net Core控制台应用程序项目。
- 启动Visual Studio IDE。
- 点击“创建新项目”。
- 在“创建新项目”窗口中,选择“控制台应用程序(。NET Core)”。
- 单击Next。
- 在接下来显示的“Configure your new project”窗口中,指定新项目的名称和位置。
- 单击Next。
- 在接下来显示的“附加信息”窗口中,选择“”。NET 7.0(标准术语支持)”作为你想要使用的框架版本。
- 单击Create。
在本文的后续部分中,我们将使用这个. net 7控制台应用程序项目来使用BufferedStream和MemoryStream类。
什么是缓冲?
缓冲区表示内存中的一个字节块,您可以在其中临时存储瞬态数据。缓冲区有助于最大限度地减少应用程序从文件系统读取和写入数据的调用次数。当需要存储从一个计算机系统传输到另一个计算机系统或从一个程序组件传输到另一个计算机系统的数据时,缓冲区非常有用。
缓冲区与流一起使用,使程序更容易有效地读写数据。缓冲区临时存储数据,因此应用程序不需要每次请求时都从磁盘重新读取数据。
使用c#中的BufferedStream类
BufferedStream类表示一种流类型,可以在将数据写入流之前缓冲数据。换句话说,缓冲流可以将数据读或写到缓冲区中,允许您一次读或写更大的数据块以提高性能。您可以从内存流和文件流创建缓冲流。
在创建BufferedStream类的实例时,还可以指定缓冲区大小。默认缓冲区大小为4096字节。从缓冲流读取数据涉及到在调用Read方法时从缓冲区读取数据。即使多次调用Read,数据也只会从流中获取一次。
写入缓冲流时,数据将写入缓冲区,然后在调用Flush方法时将数据刷新到流。这样可以避免为每个Write调用访问流,从而提高性能。当我们使用缓冲区时,我们不执行写入或读取,直到请求了一定数量的操作。
BufferedStream通过在其内部缓冲区中存储一定数量的数据,可以在同一块内存上处理多个操作,而不必一次又一次地分配内存。这样可以在重复创建新对象时节省时间和内存消耗。
注意,可以使用BufferedStream实例读取数据或写入数据,但不能使用同一个实例进行这两种操作。BufferedStream设计用于在不需要缓冲区时防止输入和输出变慢。如果读写大小总是大于内部缓冲区大小,缓冲流甚至可能不分配内部缓冲区。
下面的代码片段展示了如何使用BufferedStream将数据写入文件。
using (FileStream FileStream = new FileStream("D:\\MyTextFile.txt", FileMode. txt")创建,FileAccess.ReadWrite)) {BufferedStream BufferedStream =新的BufferedStream(fileStream, 1024);byte[] bytes = Encoding.ASCII。GetBytes("这是一个示例文本。");bufferedStream.Write(字节);bufferedStream.Flush ();bufferedStream.Close ();}
什么时候使用BufferedStream?当您希望向现有流添加缓冲支持时,请使用BufferedStream。因此,如果原始流是一个网络流,发送到它的数据将被缓存在一个小缓冲区中,然后再写入或从网络流中检索。
使用c#中的MemoryStream类
MemoryStream类表示一个轻量级流,允许您写入或读取内存缓冲区。MemoryStream类支持与Stream类相同的方法和属性。MemoryStream提供了一种直接从内存中读取或写入数据的简单方法,而不必在每次想要读取或写入时分配和释放内存。这使得它比使用其他每次使用都需要重新分配内存的技术更快。
内存流是一种非常快速和高效的流,因为数据驻留在内存中。然而,这也意味着如果程序崩溃或计算机突然关闭,它很容易丢失。
MemoryStream类是系统的一部分。IO命名空间。它可以用于读取和写入文件、网络连接和其他支持读取和写入数据的设备。MemoryStream类还可用于将对象序列化为字节流,以便通过网络连接进行存储或传输。
下面的代码片段展示了如何用c#将数据写入内存流。
byte[] bytes = System.Text.Encoding.ASCII。GetBytes("这是一个示例文本。");using (MemoryStream MemoryStream = new MemoryStream(50)) {MemoryStream。写入(bytes, 0, bytes. length);}
什么时候使用MemoryStream?顾名思义,MemoryStream是一个仅内存的流。因此,应该只在需要缓存的数据量小到足以容纳内存时才使用它。
BufferedStream速度更快,效率更高,而MemoryStream非常适合应用程序需要更快访问数据的场景。您可以使用BufferedStream和MemoryStream类的Read和Write方法的异步版本,以获得更好的性能和可伸缩性。