流和序列化(二)--流的类型体系
来源:互联网 发布:阿里云资源编排 编辑:程序博客网 时间: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来读写
- 流和序列化(二)--流的类型体系
- 序列化流的使用(二)
- .net 流——流的类型体系简单介绍
- Swift 的类型体系
- 类型的序列化和反序列化
- 序列化单例和类型安全的枚举
- python的序列,映像和集合类型
- python整理二十四——让simplejson支持datetime类型的序列化
- View的事件体系(二)
- JAVA的IO体系-流
- 序列化和反序列化(二)--自定义序列化
- 序列化和反序列化(二)
- Hadoop的序列化类型介绍
- jackson对枚举类型的序列化
- [Android知识体系]之四大组件:activity(序列化和intent传递对象)
- matlab 序列的类型
- WSS3SDK之:内容类型的基础体系
- Python序列类型的extend和+的区别
- js 停止事件冒泡 阻止浏览器的默认行为
- JAVA 入坑教程 | 章节四 修饰符
- 一个web应用的诞生(5)--数据表单
- TensorFlow和Caffe、MXNet、Keras等其他深度学习框架的对比
- 高阶篇:2)概念设计
- 流和序列化(二)--流的类型体系
- HDOJ(HDU).3466 Dividing coins ( DP 01背包 无后效性的理解)
- Mysql数据库表的自增主键ID号乱了,需要重新排列
- WebService入门
- replace()可以接受回调函数
- 多线程之线程同步
- 算法训练 Torry的困惑(基本型)
- git使用教程简介指令版
- 专利基本知识及撰写要求