在System.IO命名空间中提供了多个类,用于进行数据文件和数据流的读写操作。
1 文件和流
文件(file)和流(stream)既有区别又有联系。文件是在各种媒质上(可移动磁盘、硬盘、光盘等)永久存储的数据的有序集合。它是一种进行数据读写操作的基本对象。通常情况下,文件按照树状目录进行组织,每个文件都有文件名、文件所在路径、创建时间、访问权限等属性。
流是字节序列的抽象概念,例如文件、输入输出设备、内部进程通信管道或者TCP/IP 套接字等均可以看成流。简言之,流是一种向后备存储器写入字节和从后备存储器读取字节的方式。
流也是进行数据读取操作的基本对象,流为我们提供了连续的字节流存储空间。虽然数据实际存储的位置可以不连续,甚至可以分布在多个磁盘上,但我们看到的是封装以后的数据结构,是连续的字节流抽象结构,这和一个文件也可以分布在磁盘上的多个扇区一样。‘
除了和磁盘文件直接相关的文件流以外,还有多种其它类型的流,例如分布在网络中、内存中和磁带中的流,分别称为网络流、内存流和磁带流。
所有表示流的类都是从抽象基类Stream 继承的。
流有如下几种操作:
◆ 读取:从流中读取数据到变量中。
◆ 写入:把变量中的数据写入到流中。
◆ 定位:重新设置流的当前位置,以便随机读写。
File 类的静态方法主要是用于创建FileStream 类。一个FileStream 类的实例实际上代表一个磁盘文件,使用FileStream 类可以对文件系统上的文件进行读取、写入、打开和关闭操作,也可以对其他与文件相关的操作系统句柄进行操作,如管道、标准输入和标准输出。由于FileStream 能够对输入输出进行缓冲,因此可以提高系统的性能。
2 文件的打开
打开指定路径上的FileStream,可以使用File 类的Open 方法或OpenRead 方法或OpenText方法。利用Open 方法打开文件的方式有三种,如表所示。
表 Open方法的重载形式
名称 | 说明 |
File.Open (String, FileMode) | 打开指定路径上的 FileStream,具有读/写访问权限 |
File.Open (String, FileMode, FileAccess) | 以指定的模式和访问权限打开指定路径上的 FileStream |
File.Open (String, FileMode, FileAccess, FileShare) |
打开指定路径上的FileStream,具有指定的读、写或读/写访问模式以及指定的共享选项 |
FileMode 值用于指定在文件不存在时是否创建该文件,并确定是保留还是改写现有文件的内容;FileAccess 值指定可以对文件执行的操作;FileShare 值指定其他线程所具有的对该文件的访问类型。
3 文本文件的读写
利用Open 方法打开文件后,可以用StreamReader 类来读取文件的内容,用StreamWriter类向文件写入内容,它们提供了按文本模式读写数据的方法。下面示例中用到的OpenText 方法是File 类的一个静态方法,不能被某个具体的File 类的实例调用,它表示从一个已经存在的文本文件中读取一个文本流,并保存在一个StreamReader 实例中。
【例】从一个文本文件中读取内容并显示在屏幕上。
using System; using System.IO; class FileTest { public static void Main() { StreamReader sr; try { sr = File.OpenText("c:\c#\file1\file1.txt"); } catch { Console.WriteLine("文件打开失败"); return; } while (sr.Peek() != -1) { String str = sr.ReadLine(); Console.WriteLine(str); } Console.WriteLine("到达文件结尾"); sr.Close(); } }
【例】向文本文件中写入文本流
using System; using System.IO; class FileTest { public static void Main() { StreamWriter sw; try { sw = File.CreateText("c:\c#\file1\file2.txt"); } catch { Console.WriteLine("文件创建失败"); return; } sw.WriteLine("网址:"); sw.WriteLine("www.sohu.com"); sw.WriteLine("www.263.net"); sw.WriteLine("www.microsoft.com/china"); sw.WriteLine("www.sina.com.cn"); sw.Close(); } }
4 二进制文件的读写
System.IO 还为我们提供了BinaryReader 和BinaryWriter 类,用于按二进制模式读写文件。它们提供的一些读写方法是对称的,比如针对不同的数据结构,BinaryReader 提供了ReadByte、ReadBoolean、ReadInt、ReadInt16、ReadDouble、ReadString 等方法,而BinaryWriter 则提供了WriteByte、WriteBoolean、WriteInt、WriteInt16、WriteDoubleWriteString 方法。
【例】将内存中随机产生的二进制数据写入文件,并验证写入结果是否正确。
using System; using System.IO; class BinaryRW { static void Main() { int i = 0; //创建随机数据写入流 byte[] writeArray = new byte[1000]; new Random().NextBytes(writeArray); BinaryWriter binWriter = new BinaryWriter(new MemoryStream()); BinaryReader binReader = new BinaryReader(binWriter.BaseStream); try { //将数据写入流 Console.WriteLine("正在写数据…"); for (i = 0; i < writeArray.Length; i++) { binWriter.Write(writeArray[i]); } //流定位到开始位置 binReader.BaseStream.Position = 0; //读取流中的数据 for (i = 0; i < writeArray.Length; i++) { if (binReader.ReadByte() != writeArray[i]) { Console.WriteLine("写数据错"); return; } } Console.WriteLine("数据已写入"); } //捕获EndOfStreamException 异常,输出错误信息 catch (EndOfStreamException e) { Console.WriteLine("写数据出错 {0}", e.GetType().Name); } } }