发 帖  
原厂入驻New
[经验]

ARM开发中的的文件流是什么?

2020-10-23 17:03:19  796 文件流 ARM
分享
4
文件流

一、流的概述
​ 要完成文件的读写操作,就必须了解C#中另外一个重要的概念——流(Stream)
​ C#中流的概念可以和生活中的流相对应。在生活中有水流和电流,首先要有一个源头,还需要有传输的管道,
水流有河道、水管作为传输管道,电流有电线,而这些流都会有一个目的,就是它的流向。C#的流也需要源头——文件、数据流入流出管道以及数据的访问。
1、输出流和输入流.Net Framework中进行的所有输入、输出工作都需要用到流。
​ 1、输出流:当向某些外部目标写入数据时,就要用到输出流。
​ 2、输入流:用于将数据读到程序访问的内存或变量中。
在程序的控制台中的可以理解为:
输出流:控制台程序中,将信息从程序中输出的处理:Console.WriteLine();
输入流:通过用户键盘来输入到程序当中处理:Console.ReadLine();
2、文件读写,常用的三个类对于文件读写,常见的三个类:
​ 1、FileStream(文件流):这个类主要用于在二进制文件中读写二进制数据——也可以使用它读写任何文件
​ 2、StreamWriter(流写入器)和StreamReader(流读取器):这二个类是专门用来读写文本文件的。
二、FileStream对象### 1、FileStream对象的二种重载​ FileStream对象表示在磁盘或网络路径上指向文件的流。这个类提供了在文件中读写字节的方法。
​ 有多种方法可以创建FileStream对象,FileStream类的构造函数有很多的重载版本,最简单的重载版本仅带有二个参数,即文件路径和FileModel枚举值。
1.1、第一种重载:
  1. FileStream aFile = new FileStream( 文件路径 , FileMode.成员值);
复制代码
FileModel的枚举成员:
1.png
1.2、第二种重载:
  1. FileStream aFile = new FileStream( 文件路径, FileMode.成员值, FileAccess.成员值);
复制代码
FileAccess的枚举成员:
2.png
在FileAccess构造函数不使用FileAccess枚举参数的版本中,使用默认值FileAccess.ReadWrite。
​ File和FileInfo类中都提供了OpenRead()和OpenWrite()方法,使程序更易于创建FileStream对象。前者打 开了只读访问的文件,后者只允许写入文件。
​ 这些都提供了快捷方式,因此不一定要以FileStream构造函数的参数形式提供前面所有的信息。例如,下面的代码行打开了用于只读访问的Data.txt文件。
  1. FileStream aFile=File.OpenRead(@“C:\Data.txt”);
复制代码
或者
  1. FileInfo aFileInfo=new FileInfo(@“C:\Data.txt”);
复制代码
  1. FileStream aFile=afileInfo.OpenRead();
复制代码
2、使用FileStream读取数据和写入数据​ 使用FileStream类读取数据并不容易,这是因为FileStream类只能处理原始字节(Raw Byte)。
​ FileStream对象的Read()方法是从FileStream对象所指向的文件访问数据的主要手段。这个方法从文件中读取数据,再把数据写入一个字节数组。

​ 该方法有三个参数:第一个参数是传入的字节数组,用以接收FileStream对象中的数据。第二个参数是字节数组中开始写入数据的位置。通常是0,表示从数组开端开始放置读入的字节。最后一个参数指定从文件中读出多少字节。
3.png
2.1、读取数据:
在编写程序代码前,需导入Sysytem.IO命名空间。此应用程序打开了磁盘上某个文件,用于读取其中的部分数据。首先,通过实例化一个FileStream的对象,将流指向这个文件。
这可以通过:
  1. FileInfo aFileInfo =new FileInfo(@"C:\My Document\ReadMe1.txt");

  2. FileStream aFileInfo =aFileInfo.OpenRead();
复制代码
步骤:创建FileStream对象,并指向文件流——得到文件大小(字节单位)——创建一个相同大小的字节数组——将文件的字节内容读到数组中——将数组中字节转为字符——输出显示——关闭流
  1.   /// <summary>
  2.         /// 读取数据
  3.         /// </summary>
  4.         /// <param name="sender"></param>
  5.         /// <param name="e"></param>
  6.         private void button1_Click(object sender, EventArgs e)
  7.         {
  8.             //以只读方式创建FileStream对象
  9.             FileStream afile = new FileStream(@"C:\My Document\ReadMe1.txt",FileMode.OpenOrCreate);
  10.             //得到文件的长度/大小
  11.             long length = afile.Length;
  12.             //使用文件的长度创建一个字节数组。
  13.             byte[] Buffers = new byte[length];
  14.             //将流中的数据的字节内容读到字节数组中
  15.             afile.Read(Buffers, 0, Buffers.Length);
  16.             //将读到的数据进行转码,转为字符串
  17.             string content = Encoding.Default.GetString(Buffers, 0, Buffers.Length);
  18.             //将字符串在文件框中显示
  19.             richTextBox1.AppendText(content);
  20.             //关闭流对象,释放文件引用。
  21.             afile.Close();
  22.         }
复制代码
2.2、写入数据:
步骤:创建FileStream对象,并指向文件流——声明一个数组是写入数据字节的2倍——使用Encoding类的GetBytes()方法将字符串中的一组字符编码到字节数组中,(1、编码的字符集的字符串,2、表明第一个编码的字符的索引,3、要编码的字符的数量,4、表明要包含所产生的字节序列的字节数组,5、开始写入所产生的字节序列索引位置)
  1. /// <summary>
  2.         /// 写入数据
  3.         /// </summary>
  4.         /// <param name="sender"></param>
  5.         /// <param name="e"></param>
  6.         private void button2_Click(object sender, EventArgs e)
  7.         {
  8.             //创建一个写文件的文件流对象
  9.             FileStream aFile = new FileStream(@"C:\My Document\ReadMe1.txt",FileMode.OpenOrCreate, FileAccess.Write);
  10.             //创建字节数组
  11.             byte[] buffers;
  12.             //获取传入闻见的字符串
  13.             string content = richTextBox1.Text;
  14.             //为字节数组分配字符串
  15.             //可能会包含中文,可以将长度设为字符串长度的二倍
  16.             buffers = new byte[content.Length * 2];
  17.             //将字符串转成字节放入字节数组中
  18.             Encoding.Default.GetBytes(content, 0, content.Length, buffers, 0);
  19.             //将字节数组写入文件中
  20.             aFile.Write(buffers, 0, buffers.Length);
  21.             //关闭流对象,释放文件引用。
  22.             aFile.Close();
  23.         }
复制代码
三、StreamWrite和StreamReader对象1、StreamWriter对象
StreamWriter对象只能用于写入文件(或另一个流),StreamWriter类的构造方法有很多版本。最常用的有以下三种。
  1. StreamWriter sw=new StreamWriter(@ “C:\test.txt”);
复制代码
将使用UTF-8的编码方式创建StreamWriter对象,.NET把这种编码设置为默认的编码方式。
  1. StreamWriter sw=new StreamWriter(@ “C:\test.txt”, true);
复制代码
在这个构造函数中,第二个参数是bool类型,表示文件是否以追加的方式打开。
  1. StreamWriter sw=new StreamWriter(@ “C:\test.txt”,true,Ecoding.ASCII);
复制代码
在第三个函数中,第三个参数可以指明要使用的编码方式ASCII来创建StreamWriter对象。但不能仅以文件名和编码方式来创建对象。
当然,也可以将StreamWriter关联到一个文件流上,以获得打开文件的更多控制选项。例如以下代码。
  1. FileStream fs=new FileStream(@“C:\1.txt”,FileMode.Append,FileAccess.Write);
复制代码
  1. StreamWriter sw=new StreamWriter(fs);
复制代码
StreamWriter对象有两个方法来完成向文件或流中写入数据的功能。
WriteLine()方法:一次写入一行文本,流会自动把回车符合换行符添加到文本的末尾。
Write()方法:向流或文件中写入文本,但不会在末尾添加回车和换行符。
StreamWriter对象和FileStream对象一样,功能执行完毕后要使用Close()方法关闭以释放资源。
2、StreamReader对象StreamReader对象用于读取文本文件。用某些方式构造StreamReader对象要比构造FileStream对象更简单,因为使用StreamReader时不需要FileStream的一些选项。特别是不需要模式和访问类型,因为它只能执行读取操作。
StreamReader类的构造方法的版本比较多,最简单的构造函数只带一个文件名参数。
StreamReader sr=new StreamReader(@“C:\test.txt”);
StreamReader sr=new StreamReader(@“C:\test.txt”,Encoding.UTF8);
也可以把StreamReader关联到FileStream对象上。例如以下代码。
FileStream fs=new FileStream(@ “C:\test.txt”,FileMode.Open,FileAccess.Read);
StreamReader sr=new StreamReader(fs);
StreamReader对象读取数据的方法主要有三个。
(1) Read()方法:此方法每次读取一个字符,返回的是代表这个字符的一个正数,当独到文件末尾时返回的是-1。
(2) ReadLine()方法:此方法每次读取流中的一行数据,但不包括回车和换行符。当读到文件末尾将返回null。
(3) ReadToEnd()方法:此方法一次性读取文件中的所有数据。

3、使用StreamWriter对象写入数据和StreamReader对象读取数据 4.png
3.1、StreamWriter对象写入数据
  1. //读取数据
  2.         private void button1_Click(object sender, EventArgs e)
  3.         {
  4.             //创建StreamReader对象
  5.             //编码方式和写入数据时保持一致
  6.             StreamReader sr = new StreamReader(@"C:\My Document\ReadMe1.txt", Encoding.Default);
  7.             //利用StreamReader对象的ReadToEnd()方法读取文件中所有数据
  8.             richTextBox1.Text = sr.ReadToEnd();
  9.             //关闭StreamReader对象以释放资源
  10.             sr.Close();
  11.         }
复制代码
3.2、StreamReader对象读取数据
  1.         //写入数据
  2.         private void button2_Click(object sender, EventArgs e)
  3.         {
  4.             //创建StreamWriter对象
  5.             StreamWriter sw = new StreamWriter(@"C:\My Document\ReadMe1.txt", true, Encoding.Default);
  6.             //获取输入数据的文件并放入数组
  7.             string[] data = richTextBox1.Lines;
  8.             //遍历字符串数组
  9.             foreach (string line in richTextBox1.Lines)
  10.             {
  11.                 //将文本通过StreamWriter对象逐行写入文件
  12.                 sw.WriteLine(line);
  13.             }
  14.             //关闭StreamWriter对象以释放资源
  15.             sw.Close();
  16.         }
复制代码
四、总结​ 1、如果要对文件的内容进行读写,就需要用到流。
​ 2、FileStream只能处理原始字节(Raw Byte)。处理原始字节的功能使FileStream类可以用于任何数据文件,而不仅仅是文本文件。通过读取字节数据,FileStream对象可以用于读取图像和声音的文件。这种灵活性的代价是,不能使用FileStream对象直接读入字符串,需要将字节数组转换为字符数组或者字符串。
​ 3、虽然直接操作FileStream对象可以读取和显示文本文件,但是操作字节数组比较麻烦。如果知道某个文件包含文本,通常就可以使用StreamWriter和StreamReader类更方便的对这些文件进行写入和读,而不是FileStream对象。这是因为这些类工作的级别比较高,特别适合于读写文本。它们执行的方法可以根据流的内容,自动检测出停止读取文本较方便的位置。






评论

高级模式
您需要登录后才可以回帖 登录 | 注册

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容图片侵权或者其他问题,请联系本站作侵删。 侵权投诉
发经验
关闭

站长推荐 上一条 /9 下一条

快速回复 返回顶部 返回列表