您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 销售管理 > 70第4章 文件和数据库访问技术
高级编程技术第1章高级开发概述第2章组件化开发第3章XML技术第4章文件和数据库访问技术第5章线程和异步编程第6章分布式组件技术第7章XMLWebService第8章设计模式与构建第9章面向服务的架构(SOA)第10章开发智能设备应用程序第4章文件和数据库访问技术流流的读写操作基本文件I/O序列化数据库访问基础连接数据源使用数据集访问数据使用数据阅读器访问数据使用存储过程参考资源流流的概念流的基本原理和操作支持缓冲流操作的实现Null流实例4.1流流的概念数据存储设备的多样性硬盘网络磁带不同存储设备中数据的表示方式是不同的格式字节顺序字符编码对不同类型数据的操作方式不同流的出现改变了上述问题统一了读写和访问不同数据存储设备的方法屏蔽了不同数据存储设备之间在操作读写数据方面的差别便于不同的数据存储设备之间的交互4.1.1流的概念流的概念流提供了从后台存储设备中读取和写入字节的能力流类继承自System.IO.Stream流的基本原理和操作,包括Read、Write和Seek使用CanRead、CanWrite和CanSeek属性来判断流是否可读写及是否可搜索有些流为提高性能提供缓冲支持用Flush方法输出和清理内部缓冲Close方法释放资源Close方法隐式调用缓冲流的Flush方法.NETFramework提供的流类NetworkStream、BufferedStream、MemoryStream、FileStreamNullStream实例没有后台存储设备4.1.1流的概念流的基本原理和操作流有三种操作:可以从流读取可以向流写入可以查找4.1.2流的基本原理和操作支持缓冲为了提高性能,一些流的实现需要对基础数据进行本地缓存。对于这样的流,可以使用Flush方法来清除内部缓冲区并确保所有数据都被写入后台数据源或储存库中调用流的Close方法将刷新所有缓冲数据,本质上它还是调用了Flush方法。同时,Close方法会释放操作系统资源,例如文件句柄、网络连接或所有作为内部缓冲区的内存4.1.3支持缓冲流操作的实现System.IO命名空间包含了BufferedStream、MemoryStream和FileStream类,它们都是从System.IO.Stream类继承而来的BufferedStream类:BufferedStream类用来对其他流的缓冲区进行读写操作MemoryStream类:MemoryStream类提供了一种流的创建方法,这种流可以使用内存作为后备存储,而不是磁盘或网络连接FileStream类:FileStream类用来读/写文件CryptoStream类:CryptoStream类定义了将数据流链接到加密转换的流。4.1.4流操作的实现Null流实例有时应用程序需要流可以简单地放弃该应用程序的输出并且不返回任何输入数据从Stream类的名为Null的公共静态字段中获取一个这样的流,该流没有后备存储并且不会占用任何操作系统资源4.1.5Null流实例第4章文件和数据库访问技术流流的读写操作基本文件I/O序列化数据库访问基础连接数据源使用数据集访问数据使用数据阅读器访问数据使用存储过程参考资源流的读写操作Stream类用于字节的输入和输出。可以通过使用Reader和Writer类向使用其他类型的流以及字符串进行输入和输出下表描述了一些常用的Reader和Writer类4.2流的读写操作这些类也是继承自TextReader和TextWriter类,但它们从字符串中读取字符和将字符写入到StringBuilder类中StringReader和StringWriter这些类继承自TextReader和TextWriter类,从流中读取和向流中写入它们的字符StreamReader和StreamWriter这些类用来对字符进行输入和输出TextReader和TextWriter这些类用特定的编码将基本类型作为二进制值对流进行读取和写入BinaryReader和BinaryWriter描述类流的读写操作利用Encoding类来处理各种不同的编码方式4.2流的读写操作//获取一个能够使用GB2312进行编码/解码的Encoding的派生对象EncodingencodingGB2312=System.Text.Encoding.GetEncoding(GB2312);//这是将要编码的字符串Strings=Hithere.;//获取一个知道怎样使用UTF-8进行编码/解码的Encoding的派生对象EncodingencodingUTF8=System.Text.Encoding.UTF8;//将字符串编码为字节数组Byte[]encodedBytes==encodingUTF8.GetBytes(s);//显示编码后的字节值Console.WriteLine(Encodedbytes:+BitConverter.ToString(encodedBytes));//将字节数组解码为字符串StringdecodedString=encodingUTF8.GetString(encodedBytes);//显示解码后的字符串Console.WriteLine(Decodedstring:+decodedString);第4章文件和数据库访问技术流流的读写操作基本文件I/O序列化数据库访问基础连接数据源使用数据集访问数据使用数据阅读器访问数据使用存储过程参考资源基本文件I/O文件流的实现访问文件及其属性信息读取文本的例子写入文本的例子访问目录及其属性信息文件监视系统独立存储4.3基本文件I/O文件流的实现FileStream类用于读/写文件。在FileStream的一些构造函数中,FileMode、FileAccess和FileShare类型被作为参数使用FileMode参数:FileMode参数控制是否对文件执行覆盖、创建、打开等操作,或执行这些操作的组合FileAccess枚举:FileAccess枚举为文件的读、写或读/写访问定义了常量FileShare枚举:FileShare枚举包含一些常量,用于控制其他FileStream对同一文件所具有的访问类型使用Seek方法实现对文件的随机访问:FileStream对象使用Seek方法支持对文件的随机访问4.3.1文件流的实现访问文件及其属性信息File和FileInfo类都是实用类,主要包含用于创建、复制、删除、移动和打开文件的方法File类的所有方法都是静态的,因此不用创建这个类的实例就可以调用这些方法FileInfo类只包含实例方法4.3.2访问文件及其属性信息读取文本的例子在下面这个读取文本的例子中,将读取整个文件,并且在读到文件结尾时做出通知:4.3.3读取文本的例子写入文本的例子这个示例创建了一个新的名为MyFile.txt的文本文件,并向其中写入一个字符串、一个整数和一个浮点数,昀后关闭文件4.3.4写入文本的例子访问目录及其属性信息Directory和DirectoryInfo类提供用于创建、移动以及遍历目录和子目录的常用方法Directory类的所有方法都是静态的,因此不用创建这个类的实例就可以调用这些方法。DirectoryInfo类只包含实例方法4.3.5访问目录及其属性信息文件监视系统可以使用FileSystemWatcher组件监视文件系统,并对文件系统的改变作出反应可以配置FileSystemWatcher组件来监视整个目录及其内容,或特定目录下的一个特定的文件或一组文件可监视目录或文件中的若干种更改可以监视文件或目录的重命名、删除或创建4.3.6文件监视系统独立存储独立存储是一种安全的数据存储机制隔离,避免其他应用程序或系统访问有威胁的数据部分受信任代码的安全风险,避免这类代码影响整个系统的安全性通过IsolatedStorageFile和IsolatedStorageFileStream类来访问独立存储区的文件和目录4.3.7独立存储第4章文件和数据库访问技术流流的读写操作基本文件I/O序列化数据库访问基础连接数据源使用数据集访问数据使用数据阅读器访问数据使用存储过程参考资源序列化序列化在应用程序中的应用序列化属性对象图序列化过程序列化示例反序列化示例自定义序列化自定义反序列化自定义序列化示例安全问题4.4序列化序列化在应用程序中的应用使用序列化的原因将对象的状态保存在存储媒体中以便以后可以重新创建出完全相同的副本按值将对象从一个应用程序域发送至另一个应用程序域序列化可用于将对象复制到Windows窗体的剪贴板中,甚至在小型的应用中可以代替数据库用来存储少量的数据序列化还可用于按值将对象从一个应用程序域远程传递至另一个应用程序域4.4.1序列化在应用程序中的应用序列化在应用程序中的应用持久性不使用序列化将会给应用程序的开发者带来一种额外的繁重编程任务.NETFramework中的序列化:.NETFramework公共语言运行库减少了许多由序列化所带来的工作量由公共语言运行库维护的一些元数据能够让序列化代码发现任何对象中的全部字段和属性的类型和值应用程序只需要几行代码就可以完成序列化和反序列化4.4.1序列化在应用程序中的应用序列化在应用程序中的应用远程处理在分布式计算中,一个进程中的对象可能需要和另一个进程中的对象进行通信。序列化帮助远程处理传递对象4.4.1序列化在应用程序中的应用序列化属性用Serializable属性使类可序列化用NonSerialized属性来使类的部分成员不被序列化通过实现ISerializable接口来提供自定义序列化4.4.2序列化属性[Serializable]publicclassMyClass{}[Serializable]publicclassMyClass{}[Serializable]publicclassMyClass{[NonSerialized]int_cashSize;//...}[Serializable]publicclassMyClass{[NonSerialized]int_cashSize;//...}374291DogCatDuckMouseHorseDuck对象图4.4.3对象图对象图对象图是一组互相引用的对象。在序列化过程中,必须提供一种方法来表示序列化流里对象图中对象间的链接序列化必须为流中的每个对象分配一个惟一的编号跟踪对象引用:使用每次只访问一个对象的算法,必须保持对已经访问过的对象的跟踪,防止进入死循环4.4.3对象图序列化过程默认序列化过程ObjectIDGenerator类用来产生对象的ID当对象被反序列化时,ObjectManager类跟踪对象可以把类序列化为文件流(FileStream)、内存流(MemoryStream)和网络流(NetworkStream)Formatter类能以指定格式对输入输出流进行读写运行时提供了BinaryFormatter和SoapFormatter派生类4.4.4序列化过程序列化示例ClassSerializeExampleSharedSubMain()'创建对象图形DimlAsNewArrayList(),xAsIntegerForx=0To100l.Add(x)Next'创建filestreamDimsAsFileStream=File.Create(File.bin)'创建BinaryFormatterDimbAsNewBinaryFormatter()'把图序列化到流b.Serialize(s,l)s.Close()EndSubEndClassClassSerializeExampleSharedSubMain()'创建对象图形DimlAsNewArrayList(),xAsIntegerForx=0To100l.Add(x)Next'创建filestreamDimsAsFileStream=File.Create(File.bin
本文标题:70第4章 文件和数据库访问技术
链接地址:https://www.777doc.com/doc-4363442 .html