什么是流?
- 文件的数据从存储介质到内存再到程序程序,以及这个反向的过程里数据仿佛在一个通道中流动,我们把这个通道成为流。
- 按照输入源的不同流分为文件流、内存流、网络流等。
System.IO为我们提供了一个抽象类Stream。它在基础序列数据源与应用程序之间架设起了流动的通道。
- Read:读出流中的数据。
- Write: 向数据源中写入数据。
- Seek: 在流中定位。
BinaryReader 和 BinaryWrite类,以二进制格式操作数据
下表描述BinaryReader类常用的一些方法:
- colse:关闭当前读者和相应的流
- Read:从下层流读取字符,并且增加流的当前位置
下表描述BinaryWriter类的一些常用方法:
|
Close |
关闭当前BinaryWriter和下层的流 |
|
Seek |
在当前流设置位置 |
|
Write |
写值到当前流 |
|
Flush |
清除当前writer的所有缓存,导致任何缓存的数据被写入到下层的设备中 |
Stream类
Stream类是IO名称空间中最重要的类之一,它是派生FileStream、MemoryStream和BufferedStream等不同类的抽象类
MemoryStream类用于向内存(而不是磁盘)读写数据
Read() ----读MemoryStream并装值写入缓冲区
ReadByte() ----从MemoryStream读一个字节
Write() ----从缓冲区向MemoryStream写值
WriteByte() ----从缓冲区向MemoryStream写一个字节
WriteTo() ----将此内存流的内容写入别一个内存流
BufferedStream类用于对缓冲区进行读/写,有两个构造函数
public BufferedStream(Stream stName);
public BufferedStream(Stream stName, int bsize); // bsize表示缓冲区大小
1 static void Main(string[] args)
2 {
3 MemoryStream memStr = new MemoryStream();
4 BufferedStream buffStr = new BufferedStream(memStr);
5 buffStr.WriteByte((byte)100);
6 buffStr.Position = 0; //取得memStr的当前位置Positon属性为0,以便buffStr的当前位置设置为流的开始
7 byte[] arrb = { 1, 2, 3 };
8 buffStr.Read(arrb, 0, 1); // 用流的当前位置的值填充字节数组arrb
9 for (int i = 0; i < 3; i++)
10 {
11 Console.WriteLine("这个值是{0}", arrb[i]);
12 }
13 Console.WriteLine("ReadByte()的返回值是{0}", buffStr.ReadByte()); // 返回-1表示流的末尾
14 Console.ReadKey();
15 }
FileStream类
FileStream(文件流)是Stream派生出的子类,使用这个类我们可以建立文件与程序的通道,对文件进行二进制数据的读写
-
- Stream类被用来从文本文件中读取和写入数据。
- 它是一个抽象类,它支持读写自己到流。主要实现派生类FileStream
- 如果文件的数据仅是文本,那么你可以使用StreamReader类和StreamWriter类来完成相应的读和写任务。
FileStream 类用于对文件执行读/写操作,Read()和Write()方法用于读/写操作
FileStream类构造函数有许多重写形式,以方便创建该类的实例
FileStream(string FilePath,FileMode)
FileStream(stirng FilePath,FileMode,FileAccess)
FileStream(string
FilePath,FileMode,FileAccess,FileShare)
FileMode为enum类型(创建或打开),其值如下:
Append:打开一个文件并查找到文件末尾,以便能够附加新的数据,如果文件不存在,则新建一个文件
Create:用指定名称新建一个文件,如果存在具有相同名称的文件,则覆盖旧文件
CreateNew:新建一个文件
Open:打开一个文件,指定文件必须存在
OpenOrCreate:与Open类似,只是指定文件不存在时,新建一个
Truncate:根据此枚举,打开指定文件并将之截断为0字节(大小为0字节),文件必须存在
FileAccess枚举值(读写权限):Read / Write / ReadWrite
FileShare枚举值(共享):
None:谢绝共享当前文件。文件关闭前,打开该文件的任何请求都将失败
Read:只能对文件进行读取操作
Write:可以对文件进行写入操作
ReadWrite:可以进行对文件的读写和写入两种操作
例1:
1 static void Main(string[] args) 2 { 3 4 5 //===============================写入================================ 6 //使用FileStream读写文件 7 string path = @"e:\1.txt"; 8 9 Console.WriteLine("输入你要写入的文件内容:"); 10 string info = Console.ReadLine(); 11 //创建文件流,对str文件写操作 12 FileStream fs = new FileStream(path, FileMode.Create, FileAccess.ReadWrite, FileShare.ReadWrite); 13 //把输入的字符串解码成字节数组 14 byte[] array = new UTF8Encoding(true).GetBytes(info);//UTF8编码 15 16 //byte[] array = new ASCIIEncoding().GetBytes(info); 17 //写入 18 fs.Write(array, 0, array.Length); 19 20 21 fs.Flush();//清空缓存区 22 fs.Close();//关闭流 23 24 Console.WriteLine("写入成功"); 25 26 //===============================读取================================ 27 28 FileStream fs1 = new FileStream(path, FileMode.Open, FileAccess.ReadWrite, FileShare.ReadWrite); 29 //定义数组用于接收读取的内容 30 byte[] arr = new byte[fs1.Length]; 31 //读取 32 fs1.Read(arr, 0, arr.Length); 33 34 fs1.Close();//关闭流 35 36 Console.WriteLine("读取到得内容如下:"); 37 Console.WriteLine(new UTF8Encoding(true).GetString(arr)); 38 }