资源预览内容
第1页 / 共36页
第2页 / 共36页
第3页 / 共36页
第4页 / 共36页
第5页 / 共36页
第6页 / 共36页
第7页 / 共36页
第8页 / 共36页
第9页 / 共36页
第10页 / 共36页
亲,该文档总共36页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
第第1111课课 用流进行文件输入和输出用流进行文件输入和输出q使用不同的文件流向文件写数据和从文件读数据。q本课主要讲述:文件与流的概念使用FileStream使用StreamReader和StreamWriter11.1 11.1 文件与流文件与流q什么是文件?文件是永久存储的由一些特定顺序的字节组成的一个 有序的、具有名称的数据集合。q什么流?提供一种向后备存储器写入字节和从后备存储器中读 取字节的方式。可以理解为流是建立在文件和应用程 序之间的数据管道。磁盘上 的文件应用程序流Stream类是所有流的基类,并且Stream类是一个抽象 的类,也就是说不能创建Stream类的对象,必须通过 Stream类派生出子类,由子类创建对象。q流所具有的功能:读:将数据从一个流传输到一个数据结构(如数组)中。写:将数据从一个数据结构写到一个流中。定位:查询和修改流中的当前位置。qStream类所在的命令空间所有stream类以及stream类的派生类,都需要导入System.IO 空间。11.1.1 FileStream11.1.1 FileStream类类qFileStream类继承于Stream类,主要用于文件的输入 和输出,适合于读取原始字节(二进制)数据。q创建FileStream类的对象要使用FileStream类必须为其创建对象,可以使用 FileStream类的构造函数来创建,语法格式:FileStream(string path,FileMode mode,FileAccess access) 其中:path:指定当前FileStream对象所指向的文件的路径包含文 件的名称,即指定从哪个文件中读或写数据。qmode:确定如何打开或创建文件。是一个枚举类型, 具有以下值:FileMode.Create:指定创建一个新文件,如果指定的文件 存在,则覆盖已存在的文件。OpenOrCreate:指定如果文件存在则打开文件,如果不存在 则创建该文件。FileMode.Open:指定打开需要的文件。FileMode.Append:打开现有文件并查找文件尾,如果文件 不存在,则创建新文件。FileMode.Append只能同 FileAccess.Write一起使用,写入的新数据将添加于原文件 的后面。qaccess:确定FileStream对象可以如何访问文件。是 一个枚举类型,具有以下的值:FileAccess.Read:只能从文件中读取数据。FileAccess.ReadWrite:可从文件读取数据和将数据写入文 件。FileAccess.Write:只能将数据写入文件。qFileStream类中常用的方法Write:将字节数组中的数据写入到流中,即写入到文件中 。ReadByte:从流中读取一个字节,并将流内的位置向前推进 一个字节,如果已到达流的末尾,则返回-1。Close:将流关闭。当应用程序不再使用某个流时,应该将 其关闭。任务任务11.1 11.1 使用使用FileStreamFileStreamq问题描述创建一个应用程序,创建一个文件,将字节数组中的 数据写入此文件,然后关闭文件。接着,应用程序再 次打开文件,测试流是否支持读操作,从文件中读出 每一个字节,并将一个字节的转换为响应的字符,且 连接乘字符串。q程序代码 public static void Main()byte buf1 = new byte 65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82 ;FileStream s = new FileStream(“foot.dat“,FileMode.Create);s.Write(buf1,0,buf1.Length);s.Close();s = new FileStream(“foot.dat“,FileMode.Open);int i;string str = “;if (s.CanRead)while (i = s.ReadByte() != -1)str += (char)i;s.Close();MessageBox.Show(str,“输出结果“);11.1.2 11.1.2 随机访问文件随机访问文件q当打开一个流时,流指针一般位于流的第一个字节上。从第一 个字节的数据开始读到最后一个字节的数据。那么能不能改动 流指针,使得可以从流的任何位子读取数据呢?q流指针的定位(Seek方法)FileStream对象支持使用Seek方法把流指针定位到流中的任何 位置,进行读/写操作。q相对哪一点移动指针呢?可以使用SeekOrigin类中的属性值指定移动的参照点。Begin:指定流的开头Current:指定流内的当前位置End:指定流的结尾qSeek()方法的使用方法Seek(long offset,SeekOrigin origin) 其中:Offset:指定指针移动的偏移量,即移动多少个字节。Origin:指定指针移动的参照点 注意:如果参照点为End,那么Offset值应该为一负值 ,如果参照点为Begin,那么Offset值应该为一正值 ,如果参照点为Current,则Offset值可正可负。 例如,s.Seek(13,SeekOrigin.Begin) 以流的开始位置为参照点,指针移动13个字节。qFileStream类的两个属性Length属性:用字节表示流长度。Position属性:指定流指针的当前位置。 通过流Position属性也可以完成指针的定位。 例如s.Position=13; 将指针定位到流开始点后面的13个字节上。任务任务11.1 11.1 定位操作定位操作q问题描述 打开任务11.1创建的文件foot.dat,报告它的长度和内 部流指针位置,然后检查这个流是否支持定位。如果 支持,从相对起点Begin开始移动13个字节,向流中 进行写操作。然后再次定位,再进行读操作。q程序代码:public static void Main()string str = “;byte buf2 = new byte 83,84,85,86,87,88,90,91,92 ;FileStream s = new FileStream(“d:Databasefoot.dat“,FileMode.Open,FileAccess.ReadWrite);str = string.Format(“Lenth:0,Position:1“,s.Length,s.Position)+“n“;if (s.CanSeek)s.Seek(13,SeekOrigin.Begin);str += string.Format(“Lenth:0,Position:1“, s.Length, s.Position) + “n“;s.Write(buf2,0,buf2.Length);int i;s.Seek(0,SeekOrigin.Begin);for (; (i = s.ReadByte() != -1; )str += (char)i;MessageBox.Show(str,“输出结果“);11.1.311.1.3向文件追加数据向文件追加数据q问题描述使用文件流向前面的示例中创建的foot.dat文件的末 尾追加数据。q分析要追加数据,可以将文件的打开模式设置为 FileMode.Append,注意FileMode.Append只能和 FileAccess.Write一起使用。q代码public static void Main()byte buf4 = new byte 97,98,99,100,101;FileStream s = new FileStream(“d:Databasefoot.dat“,FileMode.Append,FileAccess.Write);s.Write(buf4,0,buf4.Length);s.Close();s = new FileStream(“d:Databasefoot.dat“, FileMode.Open, FileAccess.Read);int i;string str = “;if (s.CanRead)for (; (i = s.ReadByte() != -1; )str += (char)i;s.Close();MessageBox.Show(str,“输出结果“);11.3 StreamReader11.3 StreamReader和和StreamWriterStreamWriterFileStream适合读取原始字节(二进制)数据,如果你 希望处理字符数据,那么可以使用StreamReader和 StreamWriter类。注意,这两个类必须基于 FileStream对象。q创建StreamWriter类的对象(1)FileStream s=new FileStream(“dat.txt”,FileMode.Append,FileAccess.Writ e);/创建文件流StreamWriter fw=new StreamWriter(s);(2)StreamWriter fw=new StreamWriter(“dat.txt”,true);true:表示如果文件存在,则打开文件。qStreamWriter.WriterLine方法用于向文本文件中写入一行数据,输入完后自动换行 。q创建StreamReader类的对象(1)FileStream s=new FileStream(“dat.txt”,FileMode.Open,FileAccess.Read);StreamReader fr=new StreamReader(s);(2)streamReader fr=new StreamReader(“dat.txt”);qStreamReader.Readline方法用于从文本文件中读取一行文本。任务任务11.7 11.7 电话号码簿电话号码簿q问题描述创建如图所示的应用程序,当单击“添加”按钮,将文本框 中输入的数据(姓名和电话)写入文本,当点击“显示”按钮 时,读取文件并将结果显示在文本框中。q“添加”按钮的事件处理代码private void button1_Click(object sender, EventArgs e)FileStream s = new FileStream(“d:Databasedat.txt“,FileMode.Append,FileAccess.Wri te);string ReadString;StreamWriter fw = new StreamWriter(s);ReadString = this.textBox1.Text;ReadString += “t“ + textBox2.Text;fw.WriteLine(ReadString);fw.Close();textBox1.Text = “;textBox2.Text = “;q“显示”按钮的事件处理代码private void button2_Click(object sender, EventArgs e)string ReadString = “;string FileString;FileStream s = new FileStream(“d:Databasedat.txt“, FileMode.Open, FileAccess.Read);StreamReader fr = new StreamReader(s);doFileString = fr.ReadLine();ReadString += FileString +
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号