计算机文件基本上分为二种:二进制文件和 ASCII(也称纯文本文件)。图形文件及文字处理程序等计算机程序都属于二进制文件。这些文件含有特殊的格式及计算机代码。ASCII 则是可以用任何文字处理程序阅读的简单文本文件,由一些字符的串行组成,具有一定的编码规则。如果你将文本文件通过修改后缀的方式修改成图片,但对于程序来说本质上还是文本文件。
FileStream类——这个类主要用于在二进制文件中读写二进制数据——也可以使用它读写任何文件。 流是传输数据的对象,介于程序中直接与流交互,可以将流理解为数据本身。一个FileStream的实例可以理解为一个具体的文件。
System.IO.MemoryStream类和System.Net.Sockets.NetworkStream类。
继承关系如下图(除NetWorkStream CryptoStream外,其他均在System.IO下):
流,都是写一点多一点。从流中读一点,流就少一点,可以通过方法返回的数据来判断流读到哪了。
在使用完流后记得释放流
- Dispose(true),关闭基础流,释放 System.IO.StreamReader 使用的非托管资源和托管资源。
- Dispose(false),关闭基础流,仅释放非托管资源。
- Close(),关闭 System.IO.StreamReader 对象和基础流,并释放与读取器关联的所有系统资源。允许其他应用程序为同一个文件设置流。这个操作也会刷新缓冲区。
- 当一个类里面既有Close又有Dispose时,基本这两个函数干的事情是差不多的。
https://referencesource.microsoft.com/#mscorlib/system/io/stream.cs源码
C# 托管资源与非托管资源 - 改变从今天开始 - 博客园www.cnblogs.com
- 托管代码:为.NET编写的代码,交由CLR管理(其中包含了GC服务)
- 非托管代码:不在CLR控制下运行的代码。比如Win32 C/C++ DLL
FileStream使用举例
FileStream读取
FileStream写入
StreamReader(流读取器)StreamWriter(流写入器)——这两个类可以对文本文件和应用程序进行读写;文本文件有不同的编码格式,StreamReader会帮我们自动处理,你也可以指定编码格式去读写流。除此之外,还能对应用程序进行标准的输入输出,常见于对Process输入输出;可以将这读取器或写入器理解为单向的管道,给予我们读写的能力。这两种管道也是专门处理流的。而管道是建立在流的基础之上的。可以通过参数:路径字符串,已有文件流构件管道,还可以通过FileInfo的实例的CreateText()方法来构建管道。
与流相同的是:管道也要Close或Dispose,只有Dispose(false)是只关管道,不关流。
StreamReader源码
StreamReader示例
StreamWriter示例