我的初步了解文件流

一.流的概述

   如果我们想要对我们的文件进行各种操作,那我们就必须了解我们C#中的一个概念——流(Stream)

   我们想要了解流的概念可以从将对于流的概念对应我们生活中的各种"流"。在我们现在日常的生活中我们最离不开的就是我们的"水流"与"电流",他们的共通点就是:

     1:首先他们要有具体的一个源头:这个是最好理解的因为我们无论是"水流"与"电流"他们都需要一个"源"他们来源于哪里?

     2:要有我们传输流的管道:水流有河道、水管进行传输的管道 ,而电流有我们的电信进行传输 。

     3:我们流的具体流向:无论是水流还有电流这些流都有具体的目的流向哪里,而他的目的就是他的流向。

综上所述是我们生活中的流的共通点 。而我们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、第一种重载:

FileStream aFile = new FileStream( 文件路径 , FileMode.成员值);

FileModel的枚举成员:

成员值:文件存在:文件不存在:
Append打开文件,流指向文件的末尾,只能与枚举FileAccess.Write联合使用创建一个新文件。只能与枚举FileAccess.Write联合使用
Create删除该文件,然后创建新文件创建新文件
CreateNew抛出异常创建新文件
Open打开现有文件,流指向文件的开头抛出异常
OpenOrCreate打开现有文件,流指向文件的开头创建新文件
Truncate打开现有文件,清楚其内容。流指向文件的开头,保留文件的初始创建日期。抛出异常

1.2、第二种重载:

FileStream aFile = new FileStream( 文件路径, FileMode.成员值, FileAccess.成员值);

FileAccess的枚举成员:

成员值:说明:
Read打开文件,用于只读
Write打开文件,用于只写
ReadWrite打开文件,用于读写

​ 在FileAccess构造函数不使用FileAccess枚举参数的版本中,使用默认值FileAccess.ReadWrite。

​ File和FileInfo类中都提供了OpenRead()和OpenWrite()方法,使程序更易于创建FileStream对象。前者打 开了只读访问的文件,后者只允许写入文件。

​ 这些都提供了快捷方式,因此不一定要以FileStream构造函数的参数形式提供前面所有的信息。例如,下面的代码行打开了用于只读访问的Data.txt文件。

FileStream aFile=File.OpenRead(@“C:\Data.txt”);

或者

FileInfo aFileInfo=new FileInfo(@“C:\Data.txt”);

FileStream aFile=afileInfo.OpenRead();

2、使用FileStream读取数据和写入数据

​ 使用FileStream类读取数据并不容易,这是因为FileStream类只能处理原始字节(Raw Byte)。

​ FileStream对象的Read()方法是从FileStream对象所指向的文件访问数据的主要手段。这个方法从文件中读取数据,再把数据写入一个字节数组。

​ 该方法有三个参数:第一个参数是传入的字节数组,用以接收FileStream对象中的数据。第二个参数是字节数组中开始写入数据的位置。通常是0,表示从数组开端开始放置读入的字节。最后一个参数指定从文件中读出多少字节。

2.1、读取数据:

在编写程序代码前,需导入Sysytem.IO命名空间。此应用程序打开了磁盘上某个文件,用于读取其中的部分数据。首先,通过实例化一个FileStream的对象,将流指向这个文件。

这可以通过:

FileInfo aFileInfo =new FileInfo(@"C:\My Document\ReadMe1.txt");

FileStream aFileInfo =aFileInfo.OpenRead();

步骤:创建FileStream对象,并指向文件流——得到文件大小(字节单位)——创建一个相同大小的字节数组——将文件的字节内容读到数组中——将数组中字节转为字符——输出显示——关闭流

		/// <summary>
        /// 读取数据
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button1_Click(object sender, EventArgs e)
        {
            //以只读方式创建FileStream对象
            FileStream afile = new FileStream(@"C:\My Document\ReadMe1.txt",FileMode.OpenOrCreate);
            //得到文件的长度/大小
            long length = afile.Length;
            //使用文件的长度创建一个字节数组。
            byte[] Buffers = new byte[length];
            //将流中的数据的字节内容读到字节数组中
            afile.Read(Buffers, 0, Buffers.Length);
            //将读到的数据进行转码,转为字符串
            string content = Encoding.Default.GetString(Buffers, 0, Buffers.Length);
            //将字符串在文件框中显示
            richTextBox1.AppendText(content);
            //关闭流对象,释放文件引用。
            afile.Close();
        }

2.2、写入数据:

步骤:创建FileStream对象,并指向文件流——声明一个数组是写入数据字节的2倍——使用Encoding类的GetBytes()方法将字符串中的一组字符编码到字节数组中,(1、编码的字符集的字符串,2、表明第一个编码的字符的索引,3、要编码的字符的数量,4、表明要包含所产生的字节序列的字节数组,5、开始写入所产生的字节序列索引位置)


        /// <summary>
        /// 写入数据
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button2_Click(object sender, EventArgs e)
        {
            //创建一个写文件的文件流对象
            FileStream aFile = new FileStream(@"C:\My Document\ReadMe1.txt",FileMode.OpenOrCreate, FileAccess.Write);
            //创建字节数组
            byte[] buffers;
            //获取传入闻见的字符串
            string content = richTextBox1.Text;
            //为字节数组分配字符串
            //可能会包含中文,可以将长度设为字符串长度的二倍
            buffers = new byte[content.Length * 2];
            //将字符串转成字节放入字节数组中
            Encoding.Default.GetBytes(content, 0, content.Length, buffers, 0);
            //将字节数组写入文件中
            aFile.Write(buffers, 0, buffers.Length);
            //关闭流对象,释放文件引用。
            aFile.Close();
        }

三、StreamWrite和StreamReader对象

1、StreamWriter对象

StreamWriter对象只能用于写入文件(或另一个流),StreamWriter类的构造方法有很多版本。最常用的有以下三种。

(1) StreamWriter sw=new StreamWriter(@ “C:\test.txt”);

将使用UTF-8的编码方式创建StreamWriter对象,.NET把这种编码设置为默认的编码方式。

(2) StreamWriter sw=new StreamWriter(@ “C:\test.txt”, true);

在这个构造函数中,第二个参数是bool类型,表示文件是否以追加的方式打开。

(3) StreamWriter sw=new StreamWriter(@ “C:\test.txt”,true,Ecoding.ASCII);

在第三个函数中,第三个参数可以指明要使用的编码方式ASCII来创建StreamWriter对象。但不能仅以文件名和编码方式来创建对象。

当然,也可以将StreamWriter关联到一个文件流上,以获得打开文件的更多控制选项。例如以下代码。

FileStream fs=new FileStream(@“C:\1.txt”,FileMode.Append,FileAccess.Write);

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对象读取数据

3.1、StreamWriter对象写入数据

//读取数据
        private void button1_Click(object sender, EventArgs e)
        {
            //创建StreamReader对象
            //编码方式和写入数据时保持一致
            StreamReader sr = new StreamReader(@"C:\My Document\ReadMe1.txt", Encoding.Default);
            //利用StreamReader对象的ReadToEnd()方法读取文件中所有数据
            richTextBox1.Text = sr.ReadToEnd();
            //关闭StreamReader对象以释放资源
            sr.Close();
        }

3.2、StreamReader对象读取数据


        //写入数据
        private void button2_Click(object sender, EventArgs e)
        {
            //创建StreamWriter对象
            StreamWriter sw = new StreamWriter(@"C:\My Document\ReadMe1.txt", true, Encoding.Default);
            //获取输入数据的文件并放入数组
            string[] data = richTextBox1.Lines;
            //遍历字符串数组
            foreach (string line in richTextBox1.Lines)
            {
                //将文本通过StreamWriter对象逐行写入文件
                sw.WriteLine(line);
            }
            //关闭StreamWriter对象以释放资源
            sw.Close();
        }

四、总结

​ 1、如果要对文件的内容进行读写,就需要用到流。

​ 2、FileStream只能处理原始字节(Raw Byte)。处理原始字节的功能使FileStream类可以用于任何数据文件,而不仅仅是文本文件。通过读取字节数据,FileStream对象可以用于读取图像和声音的文件。这种灵活性的代价是,不能使用FileStream对象直接读入字符串,需要将字节数组转换为字符数组或者字符串。

​ 3、虽然直接操作FileStream对象可以读取和显示文本文件,但是操作字节数组比较麻烦。如果知道某个文件包含文本,通常就可以使用StreamWriter和StreamReader类更方便的对这些文件进行写入和读,而不是FileStream对象。这是因为这些类工作的级别比较高,特别适合于读写文本。它们执行的方法可以根据流的内容,自动检测出停止读取文本较方便的位置。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值