文件流
文件流 Stream FileStream BufferedStream MemoryStream NetworkStream …… 所有流的抽象 Stream FileStream BufferedStream MemoryStream NetworkStream ……
文件流 FileStream FileName FileMode FileAccess FileShare
FileMode 成员名称 说明 Append 打开现有文件并查找到文件尾,或创建新文件。FileMode.Append 只能同 FileAccess.Write 一起使用。任何读尝试都将失败并引发 ArgumentException。 Create 指定操作系统应创建新文件。如果文件已存在,它将被改写。这要求 FileIOPermissionAccess.Write。System.IO.FileMode.Create 等效于这样的请求:如果文件不存在,则使用 CreateNew;否则使用 Truncate。 CreateNew 指定操作系统应创建新文件。此操作需要 FileIOPermissionAccess.Write。如果文件已存在,则将引发 IOException。 Open 指定操作系统应打开现有文件。打开文件的能力取决于 FileAccess 所指定的值。如果该文件不存在,则引发 System.IO.FileNotFoundException 。 OpenOrCreate 指定操作系统应打开文件(如果文件存在);否则,应创建新文件。如果用 FileAccess.Read 打开文件,则需要 FileIOPermissionAccess.Read。如果文件访问为 FileAccess.Write 或 FileAccess.ReadWrite,则需要 FileIOPermissionAccess.Write。如果文件访问为 FileAccess.Append,则需要 FileIOPermissionAccess.Append。 Truncate 指定操作系统应打开现有文件。文件一旦打开,就将被截断为零字节大小。此操作需要 FileIOPermissionAccess.Write。试图从使用 Truncate 打开的文
FileAccess Read 打开文件,用于只读 Write 打开文件,用于只写 ReadWrite 打开文件,用于读写
FileShare 成员名称 说明 Delete 允许随后删除文件。 Inheritable 允许随后删除文件。 Inheritable 使文件句柄可由子进程继承。Win32 不直接支持此功能。 None 谢绝共享当前文件。文件关闭前,打开该文件的任何请求(由此进程或另一进程发出的请求)都将失败。 Read 允许随后打开文件读取。如果未指定此标志,则文件关闭前,任何打开该文件以进行读取的请求(由此进程或另一进程发出的请求)都将失败。但是,即使指定了此标志,仍可能需要附加权限才能够访问该文件。 ReadWrite 允许随后打开文件读取或写入。如果未指定此标志,则文件关闭前,任何打开该文件以进行读取或写入的请求(由此进程或另一进程发出)都将失败。但是,即使指定了此标志,仍可能需要附加权限才能够访问该文件。 Write 允许随后打开文件写入。如果未指定此标志,则文件关闭前,任何打开该文件以进行写入的请求(由此进程或另一进过程发出的请求)都将失败。但是,即使指定了此标志,仍可能需要附加权限才能够访问该文件。
FileStream常用方法 名称 说明 Read 从流中读取字节块并将该数据写入给定缓冲区中。 ReadByte 从文件中读取一个字节,并将读取位置提升一个字节。 Write 使用从缓冲区读取的数据将字节块写入该流。 WriteByte 将一个字节写入文件流的当前位置。
FileStream示例 //创建一个文件流 FileStream fs = new FileStream("c:\\MyFile.txt", FileMode.Create); //将字符串的内容放入缓冲区 string str = "Welcome to the Garden!"; byte[] buffer = new byte[str.Length]; for (int i = 0; i < str.Length; i++) buffer[i] = (byte)str[i]; //写入文件流 fs.Write(buffer, 0, buffer.Length); StringBuilder sb = new StringBuilder(); //定位到流的开始位置 fs.Seek(0, SeekOrigin.Begin); //读取流中前7个字符 for (int i = 0; i < 7; i++) sb.Append((char)fs.ReadByte()); //显示读取的信息和流的长度 Console.WriteLine("读取内容为:{0}", sb.ToString()); Console.WriteLine("文件长度为:{0}", fs.Length); //关闭文件流 fs.Close();
数据流
数据流 TextReader BinaryReader StreamReader StringReader
数据流 StreamReader Read ReadBlock ReadLine ReadToEnd
StreamReader示例 //程序清单P16_5.cs: using System; using System.IO; namespace P16_5 { class BaseStreamSample static void Main() StreamReader sr = new StreamReader("c:\\MyFile.txt"); Console.WriteLine("CanRead: {0}", sr.BaseStream.CanRead); Console.WriteLine("CanWrite: {0}", sr.BaseStream.CanWrite); sr.Close(); StreamWriter sw = new StreamWriter("c:\\MyFile.txt"); Console.WriteLine("CanRead: {0}", sw.BaseStream.CanRead); Console.WriteLine("CanWrite: {0}", sw.BaseStream.CanWrite); sw.Close(); }
数据流 BinaryReader Read ReadByte(s) / ReadChar(s) / ReadString ReadBoolean ReadInt16/32/64 / ReadUInt16/32/64 ReadSingle / ReadDouble / ReadDecimal
数据流 TextWriter BinaryWriter StreamWriter StringWriter
数据流 StreamWriter Write WriteLine Demo P348
数据流 BinaryWriter Write Demo P349
FileStream与StreamReader比较 1. FileStream是一个较为底层的类,只能简单地读文件到缓存区,而StreamReader封装了一些高级方法如ReadLine() 2. FileStream可读可写,而StreamReader只能读不能写 3. FileStream不能指定编码(因为它看到的只是文件的二进制形式,当然无所谓编码),而StreamReader可以指定编码,一旦指定就不允许再更改,因此编码指定是放在它的构造方法里的。默认编码为System.Text.UTF8Encoding,实际上,在StreamReader的构造方法里,它会对文件进行编码检查,当然也可以不让它检查。 4. 若对是对二进制文件进行操作,最好使用BinaryReader,若要进行写操作,则用StreamWriter,同样StreamWriter也能按指定的编码进行读写 5. StreamReader的构造方法不一定需要FileStream,只需要文件名即可 6. StreamReader关闭后,与之相关的FileStream没有关闭,(通过FileStream的CanRead的测试)