Visual Basic.NET程序设计课件第11章_第1页
Visual Basic.NET程序设计课件第11章_第2页
Visual Basic.NET程序设计课件第11章_第3页
Visual Basic.NET程序设计课件第11章_第4页
Visual Basic.NET程序设计课件第11章_第5页
已阅读5页,还剩50页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第11章数据文件主编:夏敏捷制作:张慎武本章重点System.IO命名空间的成员使用Directory、File、Path类操作文件及目录使用FileStream类读写文件使用StreamReader、StreamWriter类读写文本文件使用BinaryReader、BinaryWriter类读写二进制文件目录11.1文件概述11.2文件的访问11.3使用System.IO命名空间中的类访问文件实验十一文件处理11.1文件概述11.1.1文件11.1.2

文件的结构11.1.3

文件的分类11.1.1文件文件是在逻辑上具有完整意义的信息(程序和数据)集合。例如我们平时用Word或Excel编辑制作的文档或表格就是一个文件,把它存放到磁盘上就是一个磁盘文件,输出到打印机上就是一个打印机文件。广义地说,计算机系统中的任何输入输出设备都被当做文件进行处理。这样,计算机便可以以统一的方式处理所有的输入输出操作。11.1.2

文件的结构文件结构字符(Character):构成文件的最基本单位。字段(Field):也称为域。它由若干个字符组成,用来表示一项数据。记录(Record):由一组逻辑上相关的字段数据组合而成。文件(File):文件由若干条记录构成。构成文件的层次结构关系:字符→字段→记录→文件11.1.3

文件的分类(1/3)根据文件的性质程序文件可供计算机运行的命令文件或可执行文件,例如扩展名为.com或.exe的文件。还包括各种源程序文件,例如VisualBasic.Net中的.vb文件等。数据文件用来存储程序文件运行时需要的数据,或用 来存储程序运行的结果。例如,学生成绩、职工工资、人事档案和各种财务数据等。11.1.3

文件的分类(2/3)根据文件中数据存取方式顺序文件由一系列ASCII码字符格式的文本行组成的文件,每行的长度可以不同,文件中的每个字符都表示一个文本字符或本本格式设置序列(如换行符等)。文件里面的数据存取方式为顺序存取。

随机文件以随机方式存取的文件,有一组长度相等的记录组成。在随机文件中,字段类型可以不同,每个记录的长度是固定的,记录中的每个字段的长度也是固定的。此外,随机文件的每个记录都有一个隐含的记录号。11.1.3

文件的分类(3/3)根据文件中存储信息所使用的编码方式文本文件又称ASCII文件,是以字符方式编码和保存数据的文件。这类文件可以用字处理软件来建立和修改,保存时按纯文本方式保存。二进制文件是以二进制方式编码和保存数据的文件。二进制文件可以存储任意类型的数据,除了不限定数据类型和记录长度外,对二进制文件的访问类似于对随机文件的访问,但是必须准确地知道数据是如何写入文件的,才能正确地读取数据。11.2文件的访问11.2.1文件的访问步骤11.2.2

文件的访问方法源程序11.2.1文件的访问步骤访问数据文件的步骤:1.打开(或建立)文件。任何类型的文件必须打开(或建立)之后才能使用。若要操作的文件已经存在,则打开该文件;若要操作的文件不存在,则建立一个新文件。2.对文件进行读/写操作。文件被打开(或建立)之后,就可以对文件进行所需的操作,例如,读出、写入、修改文件数据等操作。其中,将数据从计算机的内存传输到外存的过程称为写操作,而从外存传输到内存的过程称为读操作。3.关闭文件。当对文件操作好之后,就应该将文件关闭。11.2.2

文件的访问方法使用VisualBasic运行时函数进行文件访问(VB传统方式直接文件访问)通过文件系统对象模型FSO访问通过.NET中的System.IO模型访问。VB.NET运行时文件I/O包含于Microsoft.VisualBasic命名空间。在性能上可能没有直接用system.IO类高。优点为开发人员所熟悉并且易于使用。缺点仅支持String、Date、Integer、Long、Single、Double和Decimal写入类型以及这些类型的结构和数组。不能将类序列化。VisualBasic.NET中用于文件和目录操作的函数函数说明CurDir返回表示当前目录的String值。Dir返回String值,表示与指定模式或文件属性相匹配的文件名、目录名或文件夹名,或者表示驱动器的卷标。EOF当为随机输入或顺序输入而打开的文件到达末尾时,返回Boolean值True。FileClose将I/O写入到使用FileOpen函数打开的文件。FileCopy复制文件并保留原文件。FileDateTime返回Date值,表明最近一次修改文件的日期和时间。FileLen返回Long值,表明文件的长度(字节)。FileOpen打开用于输入或输出的文件。FreeFile返回Integer值,指定FileOpen函数可以使用的下一个文件的编号。GetAttr返回FileAttribute值,表示文件、文件夹或目录的属性。Input从打开的顺序文件读取数据并将该数据分配给变量。InputString返回String值,包含在Input或Binary模式下打开的文件中的字符。LineInput从打开的顺序文件中读取一行并将其分配给String变量。Loc返回Long值,指定在打开的文件中的当前读/写位置。LOF返回Long值,表示使用FileOpen函数打开的文件的大小(字节)。Print将显示格式的数据写入顺序文件。PrintLine将显示格式的数据写入顺序文件,并以回车符结束。Seek返回Long值,指定在使用FileOpen函数打开的文件中的当前读/写位置;或为使用FileOpen函数打开的文件中的下一个读/写操作设置位置。SetAttr设置文件的属性,如ReadOnly、Hidden、Directory、Archive等等。Write将数据写入顺序文件。通常使用Input函数从文件中读取使用Write函数写入的数据。WriteLine将数据写入顺序文件,并以回车符结束。FileSystemObject(FSO)文件I/OFileSystemObject模型将文件、目录和驱动器表示为COM对象,每个对象都有自己的属性和方法。FSO对象模型位于Microsoft脚本运行时类型库中,支持通过TextStream对象创建和操纵文本文件。优点可以将许多文件I/O函数集合到单个对象中。FSO对象模型也适用于线程。

缺点只能对文本文件进行操作读写大量内容时,存储在缓冲区中可能产生很高的内存命中率。不能管理许可权限或文件和文件夹属性。

FSO对象模型的基本组件对象说明FileSystemObject创建与删除驱动器、文件夹和文件,获取其并对其进行常规操作。与此对象相关的许多方法都与其他对象中的相应方法相同。Drive获取关于连接到系统的驱动器的,如可用空间及其共享名称。File创建,删除或移动文件,以及在系统中查询文件的名称、路径和其他。Folder创建,删除或移动文件夹,以及在系统中查询文件夹的名称、路径和其他。TextStream读写文本文件。FSO文件I/O实现方法(1/2)可以使用ObjectBrowser(对象浏览器)来查看FSO模型的对象、集合、属性、方法、事件和常数。要在ObjectBrowser(对象浏览器)中查看FSO,必须首先向Microsoft脚本运行时类型库添加一个引用。步骤如下:(1)在Project(项目)菜单上,单击AddReference(添加引用)。(2)在COM选项卡上,选择MicrosoftScriptingRuntime(Microsoft脚本运行时),单击Select(选择),然后单击OK(确定)。FSO将显示在ObjectBrowser(对象浏览器)中的Interop.Scripting节点内。FSO文件I/O实现方法(2/2)使用FileSystemObject进行编程:(1)使用CreateObject方法创建一个FileSystemObject对象。(2)将一个变量定义为FileSystemObject对象。例如:DimMyFileStreamasNewScripting.FileSystemObject()(3)对新创建的对象使用相应的方法。(4)访问对象的属性。示例:使用FileSystemObject读写文件PublicClassUsesScriptingPublicSharedSubMain()DimfileSystemAsNewScripting.FileSystemObject()DimfileAsScripting.TextStreamfile=fileSystem.OpenTextFile("C:\test.txt")DimcontentsAsString=file.ReadAll()Console.WriteLine()file.Close()EndSubEndClass.NET框架公共运行库文件I/O集中在System.IO命名空间。常用的类:Directory:用于创建、移动和枚举目录和子目录的静态方法。File:用于创建、复制、删除、移动和打开文件的静态方法,并协助创建FileStream对象。FileInfo:提供创建、复制、删除、移动和打开文件的实例方法,并且帮助创建FileStream对象。FileStream:与Stream对象配合,完成更多的文件操作。我们将在下一节对它进行介绍。Path:指定文件的目录路径信息。11.3使用System.IO命名空间

中的类访问文件11.3.1流的有关基本概念11.3.2使用FileStream类访问文件11.3.3使用StreamReader和StreamWriter类

访问文本文件11.3.4使用BinaryReader和BinaryWriter类访问二进制文件11.3.1流的有关基本概念1.什么是“流”?为什么使用“流”?

可以将流视为一组连续的一维数据,包含开头和结尾,并且其中的“游标”指示了流中的当前位置。并不是所有的数据都存在于文件中。流技术使得应用程序能够基于一个编程模型,获取各种数据。11.3.1流的有关基本概念2.流的操作

基本方法:

(1)读取:从流到数据结构(如字节数组)的数据传输。

(2)写入:从数据源到流的数据传输。

(3)查找:对流内的当前位置进行的查询和修改。11.3.1流的有关基本概念3.流的种类 Stream是一个抽象类,由Stream派生出5种具体的流:FileStream:支持对文件的顺序和随机读写操作。MemoryStream:支持对内存缓冲区的顺序和随机读写操作。NETworkStream:支持对Internet网络资源的顺序和随机读写操作,存在于System.Net.Sockets名称空间。CryptoStream:支持数据的编码和解码,存在于System.Security.Cryptography名称空间。BufferedStream:支持缓冲式的读写对那些本身不支持的对象。11.3.1流的有关基本概念4.System.IO命名空间中的常用类(1)Directory类与DirectoryInfo类

这两个类主要用于文件目录操作,都提供一些用于创建、移动和遍历目录的方法。二者的区别是Directory类不必创建类的实例就可以调用它的方法,而DirectoryInfo类中的方法是实例方法,必须在创建实例后才用调用。(2)File类和FileInfo类

这两个类主要用于文件操作,都提供一些用于创建、拷贝、移动、打开文件及创建FileStream对象等的方法。二者的区别是,File类不必创建类的实例就可以调用它的方法,而FileInfo类中的方法都是实例方法,必须在创建实例后才能调用。11.3.1流的有关基本概念(3)FileStream类FileStream类是Steam类的派生类,它以字节流的方式对文件中的数据进行操作,它将对普通文件、标准输入、输出设备的操作都看作输入、输出流。(4)StreamReader类和StreamWriter类

这两个类常用于读、写文本文件。利用StreamReader类可以从文本文件中读取字符,利用StreamWriter类可以向文本文件中写入字符。(5)BinaryReader类和BinaryWriter类

这两个类主要用于读、写二进制文件。一般利用BinaryReader类从二进制文件中读取数据,BinaryWriter向二进制文件中写入数据。11.3.2使用FileStream类访问文件FileStream类的常用属性属

称说

明CanRead用于获取一个布尔值,该值指示当前文件流是否支持读操作CanWrite用于获取一个布尔值,该值指示当前文件流是否支持写操作CanSeek用于获取一个布尔值,该值指示当前文件流是否支持定位操作Length用户获取以字节为单位的文件流长度Position用于获取或设置此文件流的当前位置11.3.2使用FileStream类访问文件FileStream类的常用方法(1)构造函数格式1:ProtectedSubNew(pathAsString,modeAsFileMode)功能:以参数path指定的路径和文件名、参数mode指定

的方式创建FileStream实例。格式2:ProtectedSubNew(pathAsString,modeAsFileMode,accessAsFileAccess)功能:以参数path指定的路径和文件名、参数mode指定的模式和access指定的读写权限创建FileStream实例。11.3.2使用FileStream类访问文件(2)Read方法功能:将文件中的内容写入字节数组。格式: PublicOverridesFunctionRead(bufferAsByte(),offsetAsInteger,countAsInteger)AsInteger

注:Buffer是要写入的数组地址,offset是偏移量,count指写入字节数量。实例:

DiminstanceAsFileStream DimarrayAsByte() DimoffsetAsInteger DimcountAsInteger DimreturnValueAsInteger returnValue=instance.Read(array,offset,count)11.3.2使用FileStream类访问文件(3)Write方法功能:将一个数组写入文件中。格式: Write(buffer,offset,count)

注:Buffer是要写入数组地址,offset是偏移量,count指写入字节数量。实例:用ASCIIEncoding实例的GetBytes方法将字符串转换为数组并用FileStream类的Write方法将数组写入文件中。 Dimbuffer()AsByte DimencoderAsNewSystem.Text.ASCIIEncoding() DimstrAsString="Thisisalineoftext" ReDimbuffer(str.Length-1) Encoder.GetBytes(str,0,str.Length,buffer,0) FS.Write(buffer,0,buffer.Length)

注意:必须Resize要写入的Byte数组为要读写的长度。11.3.2使用FileStream类访问文件(4)ReadByte方法功能:从文件流中读取一个字节的数据,并将读取位置向前移动一个字节。如果读取的字节为文件尾,则返回-1。格式: PublicOverridesFunctionReadByte()AsInteger(5)WriteByte方法功能:创建FileStream对象之后,调用WriteByte写一个字节到文件中。格式: PublicOverridesSubWriteByte(valueAsByte)(6)Seek方法。功能:设置文件流的当前位置。格式: PublicOverridesFunctionSeek(offsetAsLong,originAsSeekOrigin)AsLong11.3.2使用FileStream类访问文件(7)Flush方法。功能:将保存在缓冲区中的所有数据真正写入到文件中。格式: PublicoverridesSubFlush()(8)Close方法。功能:该方法关闭文件流并释放与当前文件流关联的任何资源。格式: PublicoverridesSubClose()注意

由于FileStream类只支持字节的读写,因此,在向文件中写入数据时需要先将字符转换成字节再写入;从文件中读取数据时,需要先把读出来的字节数据转换为字符才能显示出来。【例11.1】利用FileStream类读取和保存文件内容控

件属性名属性值Form1Text读写文件-使用StreamReader和StreamWriter类StartPositionCenterScreenBtnReadText读取文件BtnWriteText保存文件EnabledFalseTextBox1MultilineTrueScrollBarsBothOFD1NameOFD1窗体中控件及属性设置程序界面设计源程序11.3.3使用StreamReader和StreamWriter类访问文本文件StreamReader类

派生自TextReader抽象类,功能是从字节流读取字符。常用方法:(1)构造函数 StreamReader有10种格式的构造函数,常用的有:格式1: PublicSubNew(streamAsStream)

功能:为指定的流初始化StreamReader类的新实例。11.3.3使用StreamReader和StreamWriter类访问文本文件格式2: PublicSubNew(pathAsString)功能:为指定路径上的指定的文件初始化StreamReader类的新实例。格式3: PublicSubNew(streamAsStream,encodingAsSystem.Text.Encoding,detectEncodingFromByteOrderMarksAsBoolean,buffersizeAsInteger)功能:为指定的流初始化

StreamReader

类的新实例,带有指定的字符编码、字节顺序标记检测选项和缓冲区大小。11.3.3使用StreamReader和StreamWriter类访问文本文件格式4: PublicSubNew(pathAsString,encodingAsSystem.Text.Encoding)功能:用指定的字符编码,为指定路径上的指定的文件初始化SteamReader类的新实例。11.3.3使用StreamReader和StreamWriter类访问文本文件例:创建一个可以读取C盘根文件夹中名为myfile.txt的文件内容的StreamReader对象,可以先建立关于该文件的FileStream对象。方法如下: DimfstreamAsNewFileStream(“C:\myfile.txt”, FileMode.Open,FileAccess.Read) DimsrAsStreamReader sr=NewStreamReader(fstream)也可以直接建立和文件关联的StreamReader对象。例:直接创建一个可以读取C盘根文件夹中名为myfile.txt的文件内容的StreamReader对象。方法如下: DimsrAsNewStreamReader(“C:\myfile.txt”)11.3.3使用StreamReader和StreamWriter类访问文本文件(2)Read方法格式: PublicOverridesFunctionRead()AsInteger功能:读取输入流中的下一个字符,并使流的当前位置提升一个字符。(3)ReadLine方法格式: PublicOverridesFunctionReadLine()AsString功能:从当前流中读取一行字符,并将数据作为字符串返回,返回的字符串中不包括回车或换行符。如果读到输入流的末尾,则返回值为空。11.3.3使用StreamReader和StreamWriter类访问文本文件(4)Peek方法格式: PublicOverridesFunctionPeek()AsInteger功能:该方法返回一个表示下一个要读取的字符的整数;如果没有更多可读取的字符或该流不支持查找,则为-1。该方法不会改变SteamReader对象的当前位置。(5)ReadToEnd方法格式: PublicOverridesFunctionReadToEnd()AsString功能:该方法从流的当前位置开始读取数据,直到流的末尾,并把读取的数据以字符串的形式返回。11.3.3使用StreamReader和StreamWriter类访问文本文件StreamWriter类

派生自TextWriter抽象类。功能是将字符写入字节流。该类有一个常用的属性BaseSteam,该属性用于获取同后备存储区连接的基础流。常用方法如下:(1)构造函数。StreamWriter有7种格式的构造函数,常用的有:格式1: PublicSubNew(streamAsStream)功能:使用默认字符编码和缓冲区大小,为指定的流初始化StreamWriter类的新实例。11.3.3使用StreamReader和StreamWriter类访问文本文件格式2: PublicSubNew(pathAsString)功能:使用默认字符编码和缓冲区大小,为指定路径上的指定文件初始化StreamWriter类的新实例。格式3: PublicSubNew(streamAsStream,encodingAsEncoding,bufferSizeAsInteger)功能:用指定的编码及缓冲区大小,为指定的流初始化

StreamWriter

类的新实例。11.3.3使用StreamReader和StreamWriter类访问文本文件格式4: PublicSubNew(pathAsString,appendAsBoolean,encodingAsEncoding,bufferSizeAsInteger)功能:使用指定编码和缓冲区大小,为指定路径上的指定文件初始化

StreamWriter

类的新实例。如果该文件存在,则可以将其改写或向其追加。如果该文件不存在,则此构造函数将创建一个新文件。11.3.3使用StreamReader和StreamWriter类访问文本文件例:创建一个可以向C盘根文件夹名为myfile.txt的文本文件写入内容的StreamWriter对象,使用默认的UTF-8编码格式。方法如下: DimfstreamAsNewFileStream(“C:\myfile.txt”, FileMode.Open,FileAccess.ReadWrite) DimswAsNewStreamWriter(fstream)也可以直接建立和文件关联的StreamWriter对象。例:直接创建一个可以向C盘根文件夹名为myfile.txt的文本文件写入内容的StreamWriter对象,使用默认的UTF-8编码格式。方法如下: DimswAsStreamWriter(“C:\myfile.txt”)11.3.3使用StreamReader和StreamWriter类访问文本文件(2)Write方法。功能:将字符、字符数组和字符串等数据写入流。常用形式:格式1: PublicOverridesSubWrite(valueAsChar)功能:向流中写入一个字符。格式2: PublicOverridesSubWrite(bufferAsChar())功能:将字符数组写入流。11.3.3使用StreamReader和StreamWriter类访问文本文件格式3: PublicOverridesSubWrite(valueAsString)功能:将字符串写入流。格式4: PublicOverridesSubWrite(ValueAsDecimal)功能:将十进制值的文本表示形式写入流。(3)WriteLine方法

该方法与Write方法的格式和功能基本相同,只是WriteLine在向流中写入指定数据后自动加上回车、换行符作为一行的结束。【例11.2】编写一个程序,利用StreamReader类和StreamWriter类读取和保存文件内容。控

件属性名属性值Form1Text读写文件-使用StreamReader和StreamWriter类StartPositionCenterScreenBtnReadText读取文件BtnWriteText保存文件EnabledFalseTextBox1MultilineTrueScrollBarsBothOFD1NameOFD1窗体中控件及属性设置窗体设计界面源程序11.3.4使用BinaryReader和BinaryWriter类访问二进制文件1.BinaryReader类(1)构造函数格式1: PublicSubNew(inputAsStream)功能:基于参数input所提供的流,用UTF-8编码初始化BinaryReader类的新实例。格式2: PublicSubNew(inputAsStream,encodingAsEncoding)功能:基于参数input所提供的流和参数encoding所提供的字符编码,初始化BinaryReader类的新实例。11.3.4使用BinaryReader和BinaryWriter类访问二进制文件(2)从流中读取基本数据类型的方法

包括ReadBoolean、ReadByte、ReadChar、ReadDecimal、ReadDouble、ReadInt6、ReadInt、ReadInt64、ReadString等。这类方法的功能共同点是均可从流中读取相应数据类型的数据,并把读取的数据作为这种类型值返回,并使流的位置移动相应类型的字节数。(3)ReadBytes方法格式: PublicOverridableFunctionReadBytes(countAsInteger)AsByte()功能:从当前流中读取参数count所指定的字节存放到字节数组中,并把流的当前位置移动count个字节。11.3.4使用BinaryReader和BinaryWriter类访问二进制文件(4)ReadChars方法格式: PublicOverridableFunctionReadChars(countAsInteger)Aschar()功能:从当前流中读取参数count所指定的字符数,一字符数组的形式返回数据,并把流的当前位置移动count个字符。11.3.4使用BinaryReader和BinaryWriter类访问二进制文件2.BinaryWriter类(1)构造函数格式1: PublicSubNew(outputAsStream)功能:用参数output所指定的流和UTF-8字符编码初始化BinaryWriter类的新实例。格式2: PublicSubNew(outputAsStream,encodingAsEncoding)功能:用参数output所指定的流和参数encoding所指定的字符编码初始化BinaryWriter类的新实例。11.3.4使用BinaryReader和BinaryWriter类访问二进制文件(2)Seek方法格式:

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论