流和序列化(二)--流的类型体系

来源:互联网 发布:阿里云资源编排 编辑:程序博客网 时间:2024/06/14 19:28

流大致可以分为以下几类。如图:



1.基础流

   基础流包含的几个类型如下图:


其定义了所有流应具有的行为,主要有以下几种。

1) 从流中读取数据:CanRead,流是否可读;Read(byte[] buffer, int offset,int count),从当前流指针处读取count字节的数据,并写入到buffer中,ReadByte(),从流中读取一个字节。

2)向流中写入数据:CanWrite,流是否可写;Write(byte[] buffer,int offset,int count),在当前流指针处从buffer中读取count字节的数据,并且写入到流中,WriteByte(Byte value),写入一个字节到流中。

3)移动流指针:CanSeek,Seek(long offset,SeekOrigin);流指针位置,Position;关闭流,Close(),Dispose();将缓存的字节立即写入存储设备,Flush();超时处理,CanTimeout,ReadTimeout,WriteTimeout;流长度,Length。


2.装饰器流

装饰器流如图所示:


这些装饰器流并没有全部定义在System.IO命名空间下。DeflateStream和GZipStream位于System.IO.Compression,用于压缩和解压缩。CrytoStream位于System.Security.Cryptography,用于加密解密;AuthenticatedStream位于System.Net.Security,用于安全性。只有BufferedStream位于System.IO下,用于增强缓存。


3.包装器类

       从上面可以看到,当文件内容从文件中经过流传递到应用程序中之后,变成了一串数字组成的Bye[]数组,那么要如何读取文件内容呢?和流相关的一组包装器类提供了这个服务。它可以方便地协助开发者处理流所包含的数据,并且不需要将流转存为Byte[]数组的形式。

      包装器类如图:


(1) StreamReader和StreamWriter(常用于读取和写入文本字符)

 StreamReader继承自TextReader,用于将流中的数据读取为字符。StreamWriter用于将字符写入到流中。StringReader和StringWriter,它们也继承了TextReader和TextWriter,但是它们用于处理字符串,而不是流。TextReader和TextWriter与流一点关系都没有,只是定义了一组通用的,读取和写入字符数据的方式。

例如:FileStream fs=new FileStream("about.txt",FileMode.Open,FileAcess.Read);

          StreamReader reader=new StreamReader(fs,Encoding.GetEncoding("GB132"));

或者   StreamReader reader=new StreamReader(fs,Encoding.UTF8);

凡涉及到文本文件的,就不可避免遇到编码方式问题。编码方式定义了字节如何转换成人类可读的字符或者文本。

(2)  BinaryReader和Binary(向流中以二进制方式写入基元类型)

   例如int,float,char,string等。BinaryReader用于从流中读取基元类型。


上面定义了一个Product类,类中定义了两个方法,Save()用于将Product类的字段写入到文件中;Load()用于将文件内容读出,并且赋值给

Product的属性。代码如下:



4.帮助类

   帮助类有File和FileInfo等.

   File是一个静态类,提供了对文件的快速操作。比如上面中新建一个文件夹时,使用File会更简单:

   FileStream fs=File.Create("about.txt");

   打开文件也是一样,File提供了Open(string path,FileMode mode),OpenRead()和OpenWrite()几个方法。File还提供了其它的一些快速操作方法。例如ReadAllText()以文本方式读取文件的全部内容,ReadAllByte()以字节方式读取文件全部内容。File还提供了写入的法,WriteAllBytes(),WriteAllLine()

对于复制文本,有一个File.Copy(string sourceFileName,string destFileName)方法。处理文件夹使用Directory类和DirectoryInfo类。


总结:

首先看文件大小——如果是大文件则用FileStream,如果是小文件则看是否是文本文件——非文本文件则用File类的 ReadAllBytes/WriteAllBytes,是文本文件则看是否是单行读写——是则用StreamReader类/StreamWriter 类,不是则用File类的ReadAllText/WriteAllText

另,任意类型的文件都可以用FileStream来读写


0 0