`
fastwind
  • 浏览: 325133 次
  • 性别: Icon_minigender_1
  • 来自: 天津
社区版块
存档分类
最新评论

内存流MemoryStream

阅读更多

编程访问文件是通过文件流对象进行的,当应用程序需要访问文件时,必须先创建一个文件流对象,此流对象和文件是一一对应关系。
在.NET中,使用抽象基类System.IO.Stream代表流,它提供Read和Write两个方法。由于数据流的有序性,因此流对象还有一个读写指针,为此,Stream类还有一个Seek方法用于移动读写指针。
FileStream对象的数据来自文件,而MemoryStream对象的数据来自内存缓冲区。这两个类都继承自Stream类。

MemoryStream的数据来自内存中的一块连续区域,这块区域称为“缓冲区(Buffer)”。可以把缓冲区看成一个数组,每个数组元素可以存放一个字节的数据。

在创建MemoryStream对象时,可以指定缓冲区的大小,并且可以在需要的时候更改。
//字节数组
byte[] buffer = new byte[600];
//填充字节数组
private void CreateExampleData()
{
for(int i=0; i<600; i )
{
//byte类型的数最大不能超过255,用256取模实现
buffer[i] = (byte)(i%256);
}
}内存流的基本使用方法:
private void OnTestMemory()
{
//创建测试数据
CreateExampleData();

//创建内存流对象,初始分配50字节的缓冲区
MemoryStream mem = new MemoryStream(50);

//向内存流中写入字节数组的所有数据
mem.Write(buffer,0,buffer.GetLength(0));

MessageBox.Show("写入数据后的内存流长度:" mem.Length.ToString());
MessageBox.Show("分配给内存流的缓冲区大小:" mem.Capacity.ToString());

mem.SetLength(550);

MessageBox.Show("调用SetLength方法后的内存流长度:" mem.Length.ToString());

mem.Capacity = 620;//此值不能小于Length属性
MessageBox.Show("调用Capacity方法后缓冲区大小:" mem.Capacity.ToString());

//将读写指针移到距流开头10个字节的位置
mem.Seek(10,SeekOrigin.Begin);
MessageBox.Show(mem.ReadByte().ToString());
mem.Close();
}内存流的Length属性代表了其中存放的数据的真实长度,而Capacity属性则代表了分配给内存流的内存空间大小。
可以使用字节数组创建一个固定大小的MemoryStream,
MemoryStream mem = new MemoryStream(buffer);这时,无法再设置Capacity属性的大小。
还可以创建只读的内存流对象。
MemoryStream mem = new MemoryStream(buffer,false);
FlieStream用于存取文件。
创建文件并写入内容:
//创建一个新文件
FileStream fsForWrite = new FileStream("test.data",FileMode.Create);
try
{
//写入一个字节
fsForWrite.WriteByte(100);
CreateExampleData();
//将字节数组写入文件
fsForWrite.Write(buffer,0,buffer.GetLength(0));
}
catch(Exception ex)
{
MessageBox.Show(ex.Message);
}
finally
{
//关闭文件
fsForWrite.Close();
}打开文件并读取内容:
private void ReadFromFile()
{
FileStream fsForRead = new FileStream("test.data",FileMode.Open);
try
{
//读入一个字节
MessageBox.Show("文件的第一个字节为:" fsForRead.ReadByte().ToString());
//读写指针移到距开头10个字节处
fsForRead.Seek(10,SeekOrigin.Begin);
byte[] bs = new byte[10];
//从文件中读取10个字节放到数组bs中
fsForRead.Read(bs,0,10);
}
catch(Exception ex)
{
MessageBox.Show(ex.Message);
}
finally
{
fsForRead.Close(); }
}如果一个程序退出了,但它打开的文件没有被关闭,将导致其他程序无法修改或删除此文件。

分享到:
评论

相关推荐

    XmlReader 读取器读取内存流 MemoryStream 的注意事项

    在使用 XmlReader 读取内存流 MemoryStream 的过程中,有几点需要注意: 1. **初始化和配置**: 在创建 XmlReader 之前,你需要先用 MemoryStream 和 XmlTextWriter 创建并写入 XML 数据。XmlTextWriter 提供了...

    .Net MVC NPOI 返回内存流导出Excel

    在这个场景中,我们将探讨如何使用.NET MVC结合NPOI库来实现内存流方式导出Excel文件,以便用户可以点击下载。 首先,我们需要了解NPOI库的基本用法。NPOI提供了两个主要的接口:HSSFWorkbook(用于处理.xls格式的...

    C# 字符串string和内存流MemoryStream及比特数组byte[]之间相互转换

    本文将详细探讨如何在字符串(string)、内存流(MemoryStream)和比特数组(byte[])之间进行转换,这对于数据存储、网络传输或者序列化/反序列化等场景非常有用。 1. **字符串转比特数组**: - `System.Text.Encoding....

    FileStream MemoryStream 内存流 文件流 生成客户端

    标签中的“内存流”可能是指`MemoryStream`,而“文件流”可能指的是`FileStream`。这两种流在处理数据时有各自的特点和适用场景。内存流适合处理内存中的数据,而文件流适合处理磁盘上的文件数据。 在资源应用中,...

    C++内存流CMemoryStream

    C++内存流CMemoryStream是MFC(Microsoft Foundation Classes)库中的一个重要组件,它允许程序在内存中读写数据,从而实现类似与文件流的操作。内存流提供了一种高效、灵活的方式来处理内存中的数据,特别是在处理...

    使用内存流操作无文件XML 编程小实例

    在这个例子中,我们首先创建了一个`MemoryStream`对象,然后使用`StreamWriter`将XML字符串写入内存流。接着,我们加载内存流到`XmlDocument`中,进行解析。最后,我们遍历XML节点,打印出元素名、属性值和文本内容...

    Delphi中文件流的基础使用方法四个实例

    TMemoryStream是内存流类,它允许在内存中存储和操作数据。它不直接与磁盘文件交互,而是提供一个在内存中读写二进制数据的缓冲区。创建一个TMemoryStream对象后,你可以向其中添加或读取字节,非常适合临时存储...

    流与文件读写

    常见的TStream子类包括TMemoryStream(内存流),TFileStream(文件流),TResourceStream(资源流)等。 3. **文件流(TFileStream)**: - TFileStream是TStream的一个实现,用于读写文件。你可以通过指定文件名...

    delphi 流读写格式化记录文件

    常见的流类有TMemoryStream(内存流)、TFileStream(文件流)和TStringStream(字符串流)等。 当我们谈论“格式化记录文件”时,通常是指包含结构化数据的文件,例如CSV(逗号分隔值)、XML或自定义格式的文件。...

    C#将jpg格式图像转换为数据流,数据流恢复jpg格式图像并显示

    // 将文件流转换为内存流 MemoryStream memoryStream = new MemoryStream(); fileStream.CopyTo(memoryStream); // 数据流现在包含了图像的字节序列 byte[] imageData = memoryStream.ToArray(); ``` 2. **...

    流和内存流进行转换

    1. 字节数组到内存流:可以通过创建一个新的MemoryStream实例,并传入一个字节数组作为构造函数的参数,实现从字节数组到内存流的转换。例如,在C#中: ```csharp byte[] byteArray = ...; // 初始化字节数组 ...

    C# 系统粘贴板 复制/粘贴 自定义对象

    本教程将详细讲解如何利用C#实现自定义对象的复制和粘贴,包括三种不同的方法:直接使用自定义对象、借助声音文件以及序列化后通过内存流操作。 首先,让我们探讨直接使用自定义对象复制粘贴的方法。在C#中,我们...

    memorystream

    内存流在计算机编程中是一种非常重要的数据处理工具,特别是在.NET框架中,`MemoryStream`类是用于在内存中读写数据的关键组件。本篇将深入探讨`MemoryStream`的使用,包括其基本概念、应用场景、语法特性以及如何...

    C#将图片存入数据库

    // 将图片保存到内存流 image.Save(memoryStream, image.RawFormat); // 获取二进制数据 byte[] imageData = memoryStream.ToArray(); ``` 2. **建立数据库连接和命令**: 要与数据库交互,你需要使用ADO...

    C# 操作压缩文件(例子)

    // 创建内存流 MemoryStream memoryStream = new MemoryStream(); using (ZipArchive archive = new ZipArchive(memoryStream, ZipArchiveMode.Create, true)) { // 创建压缩文件条目 ZipArchiveEntry entry = ...

    C#二进制读写操作

    // 创建一个内存流 MemoryStream stream = new MemoryStream(); // 创建BinaryWriter实例 using (BinaryWriter writer = new BinaryWriter(stream)) { // 写入数据 writer.Write(123); // 整数 writer....

    给定的字符中进行加密与解密

    // 创建内存流 MemoryStream ms = new MemoryStream(); CryptoStream cs = new CryptoStream(ms, encrypto, CryptoStreamMode.Write); // 写入待加密的数据 cs.Write(bytIn, 0, bytIn.Length); cs....

    网页内容生成word文档

    这段代码首先加载XSLT文件和XML数据,然后使用`XslTransform`类进行转换,将结果写入到内存流中。最后,通过HTTP响应将这个内存流作为Word文档发送给用户下载。 值得注意的是,这个过程生成的是Open XML格式的Word...

Global site tag (gtag.js) - Google Analytics