什么是流?

  • 文件的数据从存储介质到内存再到程序程序,以及这个反向的过程里数据仿佛在一个通道中流动,我们把这个通道成为流。

                           文件及IO操作(三)

  • 按照输入源的不同流分为文件流、内存流、网络流等。

System.IO为我们提供了一个抽象类Stream。它在基础序列数据源与应用程序之间架设起了流动的通道。

常见操作:
  • Read:读出流中的数据。
  • Write: 向数据源中写入数据。
  • Seek: 在流中定位。

BinaryReader 和 BinaryWrite类,以二进制格式操作数据

    下表描述BinaryReader类常用的一些方法:

  1. colse:关闭当前读者和相应的流
  2. 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         }
View Code

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 }
View Code

相关文章: