【读书笔记】C#—文件IO入门

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

由于在公司用到了IO这方面的操作,但本人对这个不太明白。在网上查阅资料后,对IO的整理归纳形成的笔记。【可能也没有整理归纳,只有CV】

文章主要知识点来自:https://www.cnblogs.com/JimmyZheng/archive/2012/03/17/2402814.html【系列文章】

其余参考,详见参考文献。
若有时间,望还是到原作者处学习。


提示:以下是本篇文章正文内容,下面案例可供参考

一、Stream基本知识

Stream:提供字节序列的一般视图。【把它理解成自然界的河水】

字节序列:字节对象都被存储为连续的字节序列,字节按照一定的顺序进行排序组成了字节序列。

【打个比方:一条河中有一条鱼游过,这个鱼就是一个字节,这个字节包括鱼的眼睛,嘴巴,等组成8个二进制,显然这条河就是我们的核心对象:流
(原文作者这个比喻真的妙)

最好的方法就是用Using语句将流对象包裹起来,用完后关闭回收即可。
所有流都要关闭,最好用Using。


二、TextReader和StreamReader

从StreamReader想到多态,即子类的指针允许(赋值给)父类指针。

2.1 StreamReader 类的定义和作用

StreamReader 的定义:实现一个 TextReader,使其以一种特定的编码从字节流中读取字符。

StreamReader对于流的读取方面非常重要,我们常用的文件的复制,移动,上传,下载,压缩,保存,远程FTP文件的读取,甚至于HttpResponse等等只要是于流相关的任何派生类StreamReader 都能够轻松处理,当然,大家甚至可以自定义相关的派生类去实现复杂的序列化。

【关于StreamReader使用,原作者讲的很细,建议可以仔细read】


三、TextWriter 和 StreamWriter

TextWriter是一个抽象的文本写入器,可以在文本上写入我们想要的格式,可以通过微软派生类或着自定义派生类来实现TextWriter的功能。

StreamWriter的概念:实现一个 TextWriter,使其以一种特定的编码向流中写入字符。
TextWriter分别是对连续字符系列处理的编写器,而StreamWriter通过特定的编码和流的方式对数据进行处理的编写器。


四、FileStream

FileStream:操作文件的stream。
文件流无法直接通过网络进行传输,而是通过网络流将客户端上传的文件传到服务器端接收,然后通过文件流进行处理,下载正好相反。

4.1 FileStream 常用构造函数介绍

*1: FileStream(SafeFileHandle, FileAccess)

非托管参数SafeFileHandle简单介绍:是一个文件安全句柄。

它是c#非托管资源,够调用非托管资源的方法,而且不属于c#回收机制,所以我们必须使用GC手动或其他方式(Finalize 或Dispose方法)进行非托管资源的回收。

故而:我们每次使用完FileStream后都必须将它关闭并释放资源

*2: FileStream(String, FileMode)
String 参数表示文件所在的地址,FIleMode是个枚举,表示确定如何打开或创建文件。

*3: FileStream(IntPtr, FileAccess, Boolean ownsHandle)

FileAccess 参数也是一个枚举, 表示对于该文件的操作权限

参数ownsHandle:也就是类似于前面和大家介绍的SafeFileHandler,有2点必须注意:
1.对于指定的文件句柄,操作系统不允许所请求的 access,例如,当 access 为 Write 或 ReadWrite 而文件句柄设置为只读访问时,会报出异常。所以 ownsHandle才是老大,FileAccess的权限应该在ownsHandle的范围之内。
2. FileStream 假定它对句柄有独占控制权。当 FileStream 也持有句柄时,读取、写入或查找可能会导致数据破坏。为了数据的安全,请使用句柄前调用 Flush,并避免在使用完句柄后调用 Close 以外的任何方法。

*4: FileStream(String, FileMode, FileAccess, FileShare)
FileShare:同样是个枚举类型:确定文件如何由进程共享。


五、MemoryStream

MemoryStream是内存流,为系统内存提供读写操作,由于MemoryStream是通过无符号字节数组组成的,可以说MemoryStream的性能可以算比较出色,所以它担当起了一些其他流进行数据交换时的中间工作,同时可降低应用程序中对临时缓冲区和临时文件的需要,其实MemoryStream的重要性不亚于FileStream,在很多场合我们必须使用它来提高性能

5.1 MemoryStream和FileStream的区别

前文中也提到了,FileStream主要对文件的一系列操作,属于比较高层的操作,但是MemoryStream却很不一样,它更趋向于底层内存的操作,这样能够达到更快的速度和性能,也是他们的根本区别,很多时候,操作文件都需要MemoryStream来实际进行读写,最后放入到相应的FileStream中,不仅如此,在诸如XmlWriter的操作中也需要使用到MemoryStream提高读写速度。

【看不懂,之后有啥需要的,再回头再看得了】
【作者推荐了书,windows核心编程】


六、BufferedStream

BufferedStream能够实现流的缓存,换句话说也就是在内存中能够缓存一定的数据而不是时时给系统带来负担,同时BufferedStream可以对缓存中的数据进行写入或是读取,所以对流的性能带来一定的提升,但是无法同时进行读取或写入工作,如果不使用缓冲区也行,BufferedStream能够保证不用缓冲区时不会降低因缓冲区带来的读取或写入性能的下降


七、NetworkStream

7.1基本概念

NetworkStream 的特殊性可以在它的命名空间中得以了解(System.Net.Sockets),使用Tcp/IP协议。如果服务器和客户端之间基于TCP连接的,他们之间能够依靠一个稳定的字节流进行相互传输信息,这也是NetworkStream的最关键的作用,有了这个神奇的协议,NetWorkStream便能向其他流一样在网络中(进行点对点的传输)。

7.2 注意的点:

NetworkStream只能用在具有Tcp/IP协议之中,如果用在UDP中编译不报错,会报异常
NetworkStream 是面向连接的
在网络中利用流的形式传递信息
必须借助Socket (也称之为流式socket),或使用一些返回的返回值,例如TcpClient类的GetStream方法
用法和普通流方法几乎一模一样,但具有特殊性

7.3 套接字(Socket)

把Socket理解Tcp/IP协议的抽象,并且能够实现Tcp/IP协议栈的工具就行。


总结

原文作者讲的非常好,等我再学一学,之后说不定能看懂更多。

如有侵权,可联系我删除。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值