当前位置: 首页 > 文章教程  > 计算机与互联网 > 网络编程

14.4读写文件

8/31/2020 9:52:39 PM 人评论

14.4读写文件

14.4 读写文件

前面介绍了用户管理文件夹和文件的类,本节将介绍用于读写文件的类,这些类表示一个通用的概念:流。

在.NET 4.5框架中进行所有的输入和输出工作都要用到流。流是一个用于传输数据的对象,数据的传输有两个方向,对应着两种类型的流。

● 输出流:用于将数据从程序传输到外部源。这里的外部源可以是物理磁盘文件。网络位置、打印机和另一个程序。

● 输入流:用于将数据从外部源传输到程序中。这里的外部源有键盘、磁盘文件等。

对应文件的读写,最常用的类有以下两种:

● FileStream(文件流):主要用于二进制文件中读写二进制数据,也可以用于读写任何的文件。

● StreamReader(流读取器)和StreamWrite(流写入器):专门用于读写文本文件。

14.4.1 FileStream类

FileStream类表示在磁盘上或网络路径上指定的文件流。这个类提供了在文件中读写二进制数据的方法。FileStream类的构造函数如下:

alt

以上代码中第1行定义FileStream构造函数。第2行的参数path用来指定要访问的文件;第3行的参数mode是FileMode类型的一个枚举成员,用于指定打开文件的模式,关于FileMode的成员可以参考表14-4。第4行的参数access是FileAccess枚举的一个成员,用于指定访问文件的方式,关于FileAccess枚举的成员参见表14-3。如果在构造FileStream对象的时候没有指定FileAccess参数,则默认为FileAccess.ReadWrite(读写)。

使用完一个流后,应该使用FileStream.Close方法将其关闭。关闭流会释放与它相关的资源,允许其他的应用程序为同一个文件设置流。在打开和关闭流之间,可以读写其中的数据,FileStream有许多的方法都可以进行文件的读写,用到最多的有以下一些。

1.Read方法

Read是从FileStream对象所指定的文件中读取数据的主要方法,该方法的声明代码如下:

alt

以上代码中第1行定义一个重载的方法Read,它有一个int类型的返回值表示读入缓冲区中的总字节数。如果当前的字节数没有所请求那么多,则总字节数可能小于所请求的字节数;如果已到达流的末尾,则为零。第2行的参数array是一个字节数组,此方法返回时包含指定的字节数组,数组中offset和(offset + count - 1)之间的值由从当前源中读取的字节替换。第二个参数offset表示array中的字节偏移量,从此处开始读取。第3行的参数count表示从文件中读取的字节数。

FileStream对象只能处理二进制数据,这使得FileStream可以用于读写任何的文件,但是这使得FileStream不能直接读取字符串。然而,可以通过几种转换类把字节数组转换为字符串,或者将字符串转换成字节数组。System.Text命名空间中的Dcoder类,可以实现这种转换。比如以下的代码:

alt

以上代码中第1行通过Encoding的UTE8.GetDecoder方法创建一个基于UTF8编码模式的Dcoder对象。第2行调用GetChars方法将指定的字节数组转换为字符数组。

2.Write方法

Write是使用从缓冲区读取的数据将字节块写入流的方法。写入数据与读取数据非常类似,首先将要写入的内容存入一个字符数组中,然后利用System.Text.Encoder对象将其转换为一个字节数组,最后调用Write方法将字节数组写入文件中去。Write方法的声明代码如下:

alt

以上代码中第1行定义一个重载的方法Write。它有三个参数,具体的含义和作用与Read方法相同,这里不再重复。

3.Seek方法

Seek是将该流的当前位置设置为给定值的方法。对文件进行读写操作的位置是由内部文件的指针决定。在大多数情况下,当打开文件时,就指向文件的开始位置,但是此指针是可以修改的,这使得应用程序可以在文件的任何位置进行读写操作,随机访问文件或跳到文件的指定位置上。当处理大型文件时会非常的省力。Seek方法的声明代码如下:

alt

上面的代码中第1行定义一个重载的方法Seek,它有一个long类型的返回值表示流中的新位置。第2行中的参数offset用于规定文件指针以字节单位的移动距离;第3行中的参数origin是SeekOrigin枚举的一个成员,用于规定开始计算的起始位置。SeekOrigin包含了三个值Begin、Current和End。下面的代码会将文件指针从文件的开始位置移动到文件的第5个字节。

alt

上面的代码中第1行创建一个文件流FileStream的对象fs并指定要访问的文件。第2行调用fs对象的Seek方法,将文件指针从文件的开始位置移动到文件的第五个字节。

不仅如此,还可以指定负查找的位置,当offset参数为负时,表示向前移动。比如下面的代码实现将文件指针移动到倒数第9个字节。

alt

以上代码中第1行创建一个文件流FileStream的对象fs并指定要访问的文件。第2行调用fs对象的Seek方法将文件指针从文件的结束位置移动到文件的倒数第9个字节。

【实例14-5】读写文件

本实例在Web应用程序的文件夹中新建文本文件并写入文本并显示,然后将文本框中的内容添加到文本末尾并显示所有文本内容,具体实现步骤如下。

01 启动Visual Studio 2012,创建一个ASP.NET Web空应用程序,命名为“实例14-5”。

02 在网站根目录下创建一个名为chap14的文件夹。

03 在网站根目录下创建一个名为Default.aspx的窗体文件。

04 单击网站目录下的Default.aspx文件,进入的“视图编辑”界面,从工具箱中拖动一个Label控件、一个TextBox控件和一个Button控件。

05 单击网站目录下的Default.aspx.cs文件,编写关键如下:

alt

上面的代码中第1行定义处理Page页面加载事件Load的方法,第2行获得应用程序根目录下的文件名。第3行判断文件如果存在,则第4行读写文件显示标签控件上。第5行判断如果文件不存在,则第6行新建文件并添加内容。

第11行处理添加按钮事件的方法,第13行判断用户输入不空,第14行调用添加到文件后面的方法。

第18行定义添加文件内容的方法,第20行创建一个输入流。第22调用Write方法将输入的文件内容写入文件。第23行调用Flush方法清空缓冲流。第24行关闭当前StreamWriter对象。

第26行定义读取文件内容的方法。第28行创建一个输出流。第32行返回内容字符串。

06 按快捷键Ctrl+F5运行程序,效果如图14-5所示。在文本框输入内容后单击“添加”按钮,显示文件中如图14-6所示的全部内容。

alt

图14-5 运行结果1

alt

图14-6 运行结果2

14.4.2 读写文本文件

因为操作二进制数据比较麻烦,因此使得使用FileStream类非常困难,为此,.NET Framework中提供了StreamWrite类和StreamReader类专门用来处理文本文件。

1.StreamWrite类

StreamWrite类允许将字符和字符串写入到文件中。有很多的方法可以用来创建StreamWrite对象,如果已经有了FileStream对象,则可以使用此对象来创建StreamWrite对象,代码如下所示:

alt

以上代码中第1行创建一个FileStream类的对象fs并指定访问文件的路径,第2行实例化一个StreamWrite对象sw,参数是第1行创建的fs对象。

还有一种是直接从文件中创建StreamWrite对象的方法,代码如下所示:

alt

以上代码中创建StreamWrite对象sw使用的构造函数有两个参数,一个是文件名,一个是布尔值,这个布尔值规定了是添加到文件的末尾还是创建新文件:值为false时,如果文件存在,则截取现有文件并打开该文件,否则创建一个新文件;值为true时,如果文件存在,则打开文件,保留原来的数据,否则创建一个新的文件。

与创建FileStream对象不同,创建StreamWrite对象不会提供一组类似的选项,除了使用布尔值时只是添加到文件的末尾或创建新文件之外,根本没有像FileStream类那样指定FileMode、FileAccess等属性的选项。如果需要使用这些高级参数,可以先在FileStream的构造函数中指定这些参数,然后利用FileStream对象来创建StreamWrite对象。

StreamWrite对象提供了两个用于写入数据的方法——Write和WriteLine,这两个方法有许多的重载版本,可以完成高级的文件输出。Write方法和WriteLine方法基本上相同,不同的是WriteLine方法在将传送给它的数据输出后,再输入一个换行符。表14-7列出了WriteLine的部分重载版本。

表14-7 WriteLine方法的重载版本

alt

2.StreamReader类

StreamReader类的工作方式与StreamWrite类似,但StreamReader是用于从文件或另一个流中读取数据的。StreamReader对象的创建方式非常类似于StreamWrite对象,最常见的方式是使用StreamWrite对象,代码如下所示:

alt

以上代码中第1行创建一个FileStream类的对象fs并指定访问文件的路径。第2行实例化一个StreamReader对象sr,参数是第1行创建的fs对象。

同样,StreamReader类也可以直接使用包含具体文件路径的字符串来创建对象,代码如下:

alt

StreamReader类中提供了常用的几个方法用于读取文件的数据,表14-8列出了常用的方法。

表14-8 StreamReader类的常用方法

alt

【实例14-6】读写文本文件

本实例演示如何利用FileInfo和StreamWriter对象实现动态创建文件并输入文件内容的功能,具体实现步骤如下:

01 启动Visual Studio 2012,创键一个ASP.NET Web空应用程序,命名为“实例14-6”。

02 在网站根目录下创建一个文件夹,命名为Resource。

03 在网站根目录下创建一个名为Default.aspx的窗体文件。

04 单击网站的目录下的Default.aspx文件,进入的“视图编辑”界面,从工具箱中拖动一个Label控件、两个TextBox控件和一个Button控件。

05 单击网站目录下的Default.aspx.cs文件,编写关键代码如下:

alt

上面的代码中第1行定义按钮控件Button1单击事件Click的方法。第2行获得根目录下文件夹中文件的路径。第3行和第4行获取用户输入的内容。第5行实例化一个FileInfo类的对象fi并指定文件路径。第6行判断如果要创建的文件不存在,就在第7行利用fi对象的CreateText方法实例化一个StreamWriter类的对象sw。第8行调用sw的WriteLine方法将输入的文件内容写入文件。第10行调用sw的Flush方法清空缓冲流。第11行关闭当前StreamWriter对象。第12行在标签控件上显示提示操作成功的文字。

06 按快捷键Ctrl+F5运行程序,如图14-7所示。

alt

图14-7 运行结果

上一篇:14.3处理文件

下一篇:14.5上机题

相关教程

共有条评论 网友评论

验证码: 看不清楚?