.net 流(Stream)

转自:http://www.oseye.net/user/kevin/blog/85

一、文件流 FileStream

FileStream流继承与Stream类,一个FileStream类的实例实际上代表一个文件流,使用FileStream类可以对文件系统上是文件进行读取、写入、打开和关闭操作。

创建FileStream实例

1、.Net提供多种获取FileStream对象的方法,其中构造函数就有10多种,我们看下典型的构造函数顺便讲解下参数含义:

  1. public FileStream(string path, FileMode mode, FileAccess access);

参数说明:
path指明文件所在的路径信息;
mode是FileMode的枚举值,表示文件打开或创建的方式,含义如下:

  • CreateNew:指定操作系统应创建新文件,如果文件已经存在,则引发IOException;
  • Create:指定操作系统应创建新文件,如果文件已经存在,它将被覆盖;
  • Open:指定操作系统应打开现有文件,如果文件不存在,则引发FileNotFoundException;
  • OpenOrCreate:指定操作系统应打开文件,如果文件不存在,则创建新文件;
  • Truncate:指定操作系统应打开现有文件,文件一旦打开,就将截断为零字节大小;
  • Append:打开先有文件并把Position设置至文件尾,如果文件不存在将创建新文件。Append只能同FileAccess.Write一起使用;

access是FileAccess的枚举值,它控制对文件的访问权限,含义如下:

  • Read:打开文件用于只读;
  • Write:打开文件用于只写;
  • ReadWrite:打开文件,用于读写;

2、除了FileStream类本身提供的构造函数外,System.IO命名空间下的File和FileInfo类也提供了创建FileStream对象的方法。其中OpenRead方法返回只读文件流,OpenWrite方法返回只写文件流。如:

FileStream fs=File.OpenRead(@"c:file.txt");

FileStream的读写方法:

public override int Read(
byte[] array, //内存缓冲区,储存从文件流中读取的数据
int offset, //array开始写入数据的下标值
int count //从文件流中读取的字节大小
);
public override void Write(
byte[] array, //内存缓冲区,存储了要写入流的字节数据
int offset, // 从array的下标值开始取数据
int count //要写入的字节数
);

FileStream实例 

try
{
  //写入
  FileStream fileStream = new FileStream(@"d:	est.txt", FileMode.OpenOrCreate);
  byte[] content = Encoding.UTF8.GetBytes("我爱我家");
  fileStream.Write(content, 0, content.Length);
  fileStream.Position = 0; //设置当前位置
  content = Encoding.UTF8.GetBytes("我爱你家");
 
  fileStream.Write(content, 0, content.Length);
  fileStream.Close();
 
  //读取
  fileStream = new FileStream(@"d:	est.txt", FileMode.Open);
  content = new byte[fileStream.Length];
  fileStream.Read(content, 0, content.Length);
  Console.WriteLine(Encoding.UTF8.GetString(content));
}
catch (Exception ex)
{
  Console.WriteLine(ex.Message);
}


二、内存流 MemoryStream

和文件流不同,MemoryStream类表示的是保存在内存中的数据流,由内存流封装的数据可以在内存中直接访问。内存一般用于暂时缓存数据以降低应用程序对临时缓冲区和临时文件的需要。

既然字节数据也在内存中存储,为什么还要引入内存流的概念呢?这是因为内存流和字节数组虽然都位于程序缓冲区,但是具有不同特性。内存流相对于字节数组而言,具有流特有的特性,并且容量可自动增长,在数据加密以及对长度不定的数据进行缓存等场合,使用内存流比较方便。

创建MemoryStream实例

MemoryStream有多种构造函数,部分举例如下:

  • public MemoryStream();该构造函数初始分配的容量大小为0,随着数据的不断写入,其容量可以不断地自动扩展。
  • public MemoryStream(byte[] buffer);根据字节数组buffer初始化,实例的容量大小规定为字节数组的长度。
  • public MemoryStream(int capacity);容量固定为capacity。

MemoryStream实例

MemoryStream mem = new MemoryStream();
Console.WriteLine("初始分配的容量:"+mem.Capacity+" 初始使用量:"+mem.Length);
byte[] content = Encoding.UTF8.GetBytes("我爱我家");
mem.Write(content, 0, content.Length);
Console.WriteLine("初始分配的容量:" + mem.Capacity + " 初始使用量:" + mem.Length);

三、网络流NetWorkStream

网络流的意思是数据在网络的各个位置之间是以连续的字节形式传输的,NetWorkStream只能用于面向连接的套接字。

对于NetWorkStream流,写入操作是指从来源端内存缓冲区到网络上的数据传输;读取操作是从网络上到接收端内存缓冲区的数据传输。

如需对NetWorkStream深入了解,请查阅相关资料。

原文地址:https://www.cnblogs.com/gavin-num1/p/5190312.html