第16章流和文件 主要内容 本章介绍文件操作,主要内容包括流和文件、文件的输入输 出、读写二进制文件、读写文本文件以及文件管理。本章学 习的目标包括:理解流类层次结构;掌握对文件的创建、读 写和相关操作;理解C#应用程序中对文件的管理
第16章 流和文件 主要内容 本章介绍文件操作,主要内容包括流和文件、文件的输入输 出、读写二进制文件、读写文本文件以及文件管理。本章学 习的目标包括:理解流类层次结构;掌握对文件的创建、读 写和相关操作;理解C#应用程序中对文件的管理
16.1基本概念 完整的数据集合称为一个“文件”,文件由“记录”构成, 记录可以是任何类型的数据 文件存放在硬盘上,就有一个存放路径。对于路径,一般采 用目录管理的方式 C#使用流来处理数据文件。 在C#中,文件处理属于输入、输出操作,因此,文件的相关 操作都需使用 System. IO名空间。 System IC名空间包含允许读 写文件和数据流的类型以及提供基本文件和目录支持的类型, 该名空间中包含许多文件操作相关的类。我们大致将这些主 要的类分为三种:第一种类和文件的管理有关,比如创建文 件、复制文件、将文件从一个路径移动到另一个路径下等等 第二种类和文件本身的操作相关,如读、写文件等。第三种 类则是文件操作时的异常类,例如打开不存在的文件等
16.1 基本概念 完整的数据集合称为一个“文件”,文件由“记录”构成, 记录可以是任何类型的数据。 文件存放在硬盘上,就有一个存放路径。对于路径,一般采 用目录管理的方式。 C#使用流来处理数据文件。 在C#中,文件处理属于输入、输出操作,因此,文件的相关 操作都需使用System.IO名空间。System.IO 名空间包含允许读 写文件和数据流的类型以及提供基本文件和目录支持的类型, 该名空间中包含许多文件操作相关的类。我们大致将这些主 要的类分为三种:第一种类和文件的管理有关,比如创建文 件、复制文件、将文件从一个路径移动到另一个路径下等等。 第二种类和文件本身的操作相关,如读、写文件等。第三种 类则是文件操作时的异常类,例如打开不存在的文件等
16.12文件相关类的层次结构 stem. IO Binary Reader Sy stem. IO Directory System. MarshalBy RefObject System. IO DirectoryInfo System.Io. Srea System. IO BufferedStream System. IO File Stream System. IO. Memory Stream e System. IO.TextReader System. IO StreamReader System. IO StringReader stem.Io.Text Writer System1O.StreamWriter Sy stem. IO. Memory Write 图161文件相关类的层次结构
16.1.2 文件相关类的层次结构 System.MarshalByRefObject System.IO.FileSystemInfo System.IO.DirectoryInfo System.IO.FileInfo System.IO.Sream System.IO.BufferedStream System.IO.FileStream System.IO.MemoryStream System.IO.TextReader System.IO.TextWriter System.IO.StreamReader System.IO.StreamWriter System.IO.StringReader System.IO.MemoryWriter System.Object System.IO.BinaryReader System.IO.Path System.IO.File System.IO.BinaryWriter System.IO.Directory 图16.1 文件相关类的层次结构
162文件的基本操作 这一节讲解文件的基本操作,主要是文件的创建、读、写和更新。 文件的创建一般属于文件管理的范畴,而文件的读、写和更新则通 常认为是文件的操作,因为文件的管理,还有目录管理,相关的类 般不是 Stream和它的派生类,而文件的读写则一般由 Stream或者 它的派生类来实现,读写相关的类还有 TextReader、 Text Writer、 Binary reader、 Binary Writer及其相关类
16.2 文件的基本操作 这一节讲解文件的基本操作,主要是文件的创建、读、写和更新。 文件的创建一般属于文件管理的范畴,而文件的读、写和更新则通 常认为是文件的操作,因为文件的管理,还有目录管理,相关的类 一般不是Stream和它的派生类,而文件的读写则一般由Stream或者 它的派生类来实现,读写相关的类还有TextReader、TextWriter、 BinaryReader、BinaryWriter及其相关类
16.2.1文件的创建(1) ■利用Fie类 第一种方法利用File类,因为File类提供用于创建、复制、删除、移动和打开文件 的静态方法,因此创建文件时不需要生成Fie类的实例,直接利用Fie类,调用它 的 Create()方法即可,代码如下: File. create( filename) filename可以是文件名本身,也可以带绝对地址 ■利用 Filelnfo类 第二种方法和第一种类似,利用的是 Filelnfo类,因为 Filelnfo类提供创建、复制 删除、移动和打开文件的实例方法,因此,和上面方法的不同之处在于创建文件 时,先生成 FileInfo类的实例,调用该实例的 Create()方法。其示意代码如下: FileInfo myfile= new FileInfo(filename): myfile. Create 同样, filename可以是文件名本身,也可以带绝对地址
16.2.1 文件的创建 (1) ◼ 利用File类 第一种方法利用File类,因为File类提供用于创建、复制、删除、移动和打开文件 的静态方法,因此创建文件时不需要生成File类的实例,直接利用File类,调用它 的Create()方法即可,代码如下:File.Create(filename); filename可以是文件名本身,也可以带绝对地址。 ◼ 利用FileInfo类 第二种方法和第一种类似,利用的是FileInfo类,因为FileInfo类提供创建、复制、 删除、移动和打开文件的实例方法,因此,和上面方法的不同之处在于创建文件 时,先生成FileInfo类的实例,调用该实例的Create()方法。其示意代码如下: FileInfo myfile = new FileInfo(filename); myfile.Create(); 同样,filename可以是文件名本身,也可以带绝对地址
162.1文件的创建(2) ■利用 File stream类 在调用其构造函数时给出文件名即可。具体的代码分别如下 FileStream my Stream -new FileStream(FileName, FileMode Create FileAccess Read Write) 第一个参数是文件名,可以带绝对路径,后面两个参数分别表示操 作模式和访问方式。 ■利用 StreamWriter类 在调用其构造函数时给出文件名即可。具体的代码分别如下: Stream Writer myStream Writer=new Stream Writer(FileName)
16.2.1 文件的创建 (2) ◼ 利用FileStream类 在调用其构造函数时给出文件名即可。具体的代码分别如下: FileStream myStream = new FileStream(FileName, FileMode.Create, FileAccess.ReadWrite); 第一个参数是文件名,可以带绝对路径,后面两个参数分别表示操 作模式和访问方式。 ◼ 利用StreamWriter类 在调用其构造函数时给出文件名即可。具体的代码分别如下: StreamWriter myStreamWriter = new StreamWriter(FileName);
1622读文件(1) 从文件中读取数据也有多种方法,主要是 Stream类及其派生类 Stream类中有两个读文件的方法 ReadByte()和Read(),前者从流中读取一个 字节,并将流内的位置向前推进一个字节,返回读入字节转化而来的整数,如果 口到达流的末尾,则返回-1:后者从当前流读取字节序列,并将此流中的位置提 升读取的字节数,返回所读字节的数目 Stream类的派生类,包括 Filestream、 BufferedStream和 MemoryStream类,都重载 了其父类的方法 Read Byte()和Read()。不同的是, Filestream的 Read Byte() 方法从文件中读取一个字节,并将读取位置提升一个字节; Buffered Stream的 ReadByte()方法从基础流中读取一个字节,并返回转换为int的该字节,如果从 流的末尾读取,则返回-1; MemoryStream类的 Read Byte()方法是从当前流中读 取一个字节。 Filestream和 Buffered Stream的Read()方法都是从流中读取字节块 并将该数据写入给定缓冲区中;而 Memory Stream的Read()方法则是将字节从 当前缓冲流复制到数组
16.2.2 读文件 (1) 从文件中读取数据也有多种方法,主要是Stream类及其派生类。 Stream类中有两个读文件的方法ReadByte()和Read(),前者从流中读取一个 字节,并将流内的位置向前推进一个字节,返回读入字节转化而来的整数,如果 已到达流的末尾,则返回-1;后者从当前流读取字节序列,并将此流中的位置提 升读取的字节数,返回所读字节的数目。 Stream类的派生类,包括FileStream、BufferedStream和MemoryStream类,都重载 了其父类的方法ReadByte()和Read()。不同的是,FileStream的ReadByte() 方法从文件中读取一个字节,并将读取位置提升一个字节;BufferedStream的 ReadByte()方法从基础流中读取一个字节,并返回转换为int的该字节,如果从 流的末尾读取,则返回-1;MemoryStream类的ReadByte()方法是从当前流中读 取一个字节。FileStream和BufferedStream的Read()方法都是从流中读取字节块 并将该数据写入给定缓冲区中;而MemoryStream的Read()方法则是将字节从 当前缓冲流复制到数组
1622读文件(2) 另外,类 Binary reader、 Text Reader以及 TextReader的派生类 StreamReader和 StringReader也提供了读取文件内容的功能。 类 Text Reader表示可读取连续字符系列的阅读器,它以及它的派生类 StreamReader 和 StringReader提供了四种读取方法:Read()、 Roadblock()、 Readline() 和 ReadToEnd()。 TextReader的Read()从输入流读取数据; StreamReader和 StringReader的Read()则分别读取输入流和输入字符串中的下一个字符或下 组字符。三者的 Roadblock()从当前流/字符串中读取最大数量的字符并从 index 开始将该数据写入ber;其 ReadLine()从当前流/基础字符串中读取一行字符 并将数据作为字符串返回。 Text Reader的 ReadToEnd()读取从当前位置到 Text Reader的结尾的所有字符并将它们作为一个字符串返回; Stream Reader的 ReadToEnd()从流的当前位置到末尾读取流; StringReader的 ReadToEnd()则 将整个流或从流的当前位置到流的结尾作为字符串读取 类 Binary reader,用特定的编码将基元数据类型读作二进制值
16.2.2 读文件 (2) 另外,类BinaryReader、TextReader以及TextReader的派生类StreamReader和 StringReader也提供了读取文件内容的功能。 类TextReader表示可读取连续字符系列的阅读器,它以及它的派生类StreamReader 和StringReader提供了四种读取方法:Read()、ReadBlock()、ReadLine() 和ReadToEnd()。TextReader的Read()从输入流读取数据;StreamReader和 StringReader的Read()则分别读取输入流和输入字符串中的下一个字符或下一 组字符。三者的ReadBlock()从当前流/字符串中读取最大数量的字符并从index 开始将该数据写入buffer;其ReadLine()从当前流/基础字符串中读取一行字符 并将数据作为字符串返回。TextReader的ReadToEnd()读取从当前位置到 TextReader的结尾的所有字符并将它们作为一个字符串返回;StreamReader 的 ReadToEnd()从流的当前位置到末尾读取流;StringReader的ReadToEnd()则 将整个流或从流的当前位置到流的结尾作为字符串读取。 类BinaryReader用特定的编码将基元数据类型读作二进制值
1623写文件(1) ,,2, 写文件内容和文件内容的读取相似, Stream类中有两个写文件的方 法 Write()和 Write Byte(),前者向当前流中写入字节序列,并将 此流中的当前位置提升写入的字节数,后者将一个字节写入流内的 当前位置,并将流内的位置向前推进一个字节 Strean类的派生类,包括 Filestream、 BufferedStrean和 Memory Strean类,都重载了其父类的方法Wrte()和 WriteByte ()。 Filestream的 Write()方法使用从缓冲区读取的数据将字节 块写入该流; Bufferedstream的 Write()方法将字节复制到缓冲流, 并将缓冲流内的当前位置前进写入的字节数; Memory Stream的 Write()方法使用从缓冲区读取的数据将字节块写入当前流 Filestream的 WriteByte()方法将一个字节写入文件流的当前位置;
16.2.3 写文件(1) 写文件内容和文件内容的读取相似,Stream类中有两个写文件的方 法Write()和WriteByte(),前者向当前流中写入字节序列,并将 此流中的当前位置提升写入的字节数,后者将一个字节写入流内的 当前位置,并将流内的位置向前推进一个字节。 Stream类的派生类,包括FileStream、BufferedStream和 MemoryStream类,都重载了其父类的方法Write()和WriteByte ()。FileStream的Write()方法使用从缓冲区读取的数据将字节 块写入该流;BufferedStream的Write()方法将字节复制到缓冲流, 并将缓冲流内的当前位置前进写入的字节数;MemoryStream的 Write()方法使用从缓冲区读取的数据将字节块写入当前流。 FileStream的WriteByte()方法将一个字节写入文件流的当前位置;
1623写文件(2) BufferedStream的 WriteByte()方法将一个字节写入缓冲流的当前 位置; Memory Stream的 Write Byte()方法将一个字节写入当前流中 的当前位置。 MemoryStream还提供了 WriteTo()方法,其功能是 将此内存流的整个内容写入另一个流中。 类 Text Writer,及其派生类 Stream Writer和 String Writer也提供了写文件 内容的功能,它们提供了 Write()和 WriteLine()方法,前者将给 定数据类型写入文本流流,后者写入重载参数指定的某些数据,后 跟行结束符 类 Binary Writer以二进制形式将基元类型写入流,并支持用特定的编 码写入字符串。它提供 Write()方法将值写入当前流
16.2.3 写文件 (2) BufferedStream的WriteByte()方法将一个字节写入缓冲流的当前 位置;MemoryStream的WriteByte()方法将一个字节写入当前流中 的当前位置。MemoryStream还提供了WriteTo()方法,其功能是 将此内存流的整个内容写入另一个流中。 类TextWriter及其派生类StreamWriter和StringWriter也提供了写文件 内容的功能,它们提供了Write()和WriteLine()方法,前者将给 定数据类型写入文本流/流,后者写入重载参数指定的某些数据,后 跟行结束符。 类BinaryWriter以二进制形式将基元类型写入流,并支持用特定的编 码写入字符串。它提供Write()方法将值写入当前流