2024年6月14日发(作者:)

使用MemoryStream和FileStream

编程访问文件是通过文件流对象进行的,当应用程序需要访问文件时,必须先创建一个文件

流对象,此流对象和文件是一一对应关系。

在.NET中,使用抽象基类代表流,它提供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);

//向内存流中写入字节数组的所有数据

(buffer,0,gth(0));

("写入数据后的内存流长度:" +

ng());

("分配给内存流的缓冲区大小:" +

ng());

gth(550);

("调用SetLength方法后的内存流长度:" +

ng());

ty = 620;//此值不能小于Length属性

("调用Capacity方法后缓冲区大小:" +

ng());

//将读写指针移到距流开头10个字节的位置

(10,);

(te().ToString());

();

}

内存流的Length属性代表了其中存放的数据的真实长度,而Capacity属性则代表了分配给

内存流的内存空间大小。

可以使用字节数组创建一个固定大小的MemoryStream,

MemoryStream mem = new MemoryStream(buffer);

这时,无法再设置Capacity属性的大小。

还可以创建只读的内存流对象。

MemoryStream mem = new MemoryStream(buffer,false);

FlieStream用于存取文件。

创建文件并写入内容:

//创建一个新文件

FileStream fsForWrite = new

FileStream("",);

try

{

//写入一个字节

yte(100);

CreateExampleData();

//将字节数组写入文件

(buffer,0,gth(0));

}

catch(Exception ex)

{

(e);

}

finally

{

//关闭文件

();

}

打开文件并读取内容:

private void ReadFromFile()

{

FileStream fsForRead = new FileStream("",);

try

{

//读入一个字节

("文件的第一个字节为:

"+te().ToString());

//读写指针移到距开头10个字节处

(10,);

byte[] bs = new byte[10];

//从文件中读取10个字节放到数组bs中

(bs,0,10);

}

catch(Exception ex)

{

(e);

}

finally

{

(); }

}

如果一个程序退出了,但它打开的文件没有被关闭,将导致其他程序无法修改或删除此文件。