一.什么是I/0流?
英文翻译:Input/Output,在程序里简单的理解为读写数据操作数据的意思。流操作是为了解决体积大数据占用太多的内存,就是分段进行操作。就跟我们吃饭一样,一口一口的吃,还没见过谁直接一口吃完的。流就是细水长流。
在我们强大的Net中,就是微软为了简化我们的工作,为了我们能对一系列的对象进行行操作,读写。NetFrameWork为我们.Net程序员提供了各种各样的类方便我们操作。他们都在Sytem.IO这个命 名空间,我们下面的内容就是要对这些类做详细的说明。
二.有几种流,这几种流的区别是什么,怎么用?
1.常用的流
文件流 FileStream
内存流MemoryStream
网络流NetworkStream
这个三个流都是从Stream继承下来的,还有几个不常用的流。
2.Stream介绍
可以看到Stream类是抽象类,定义了流应有的一些基本操作的声明,具体实现由继承它的具体子类流实现。
属性说明:
Position 表示流的位置,
Length 表示流的长度。
CanWrite表示当前流是否可以写入。
CanTimeOut表示当前的流是否可以超时。
CanSeek表示 获取指示当前流是否支持查找功能的值。
CanRead表示当前流是否支持读取操作。
ReadTimeout 设置读取操作时候的超时时间。
WriteTimeout 设置写入操作的时候超时的时间。
方法说明下:
Synchronized:MSDN 上解释是指定的 Stream 对象周围创建线程安全(同步)包装。这个解释我也不是很明白,应该就是给流包装一下,返回值还是一个流。
BeginRead:开始异步读操作,参数1:是一个byte数组,作为流的缓冲区,参数2是开始读取的位置,第三个参数是读取的读取的长度。第四个参数是一个回调用委托参数,这个参数的作用,是在流读取完成之后执行某些操作,第五个参数就是一个自定义的对象状态。用与其他的流区分。这个参数不管它,占时我也不知道有啥用。
BeginWrite:同理我就不说了。
Close:我就不说了。
CoptyToStream:从当前流中读取字节并将其写入到另一流中。
CoptyToAsync:从名字就可以看出区别的和上面的功能一样,只是异步读取。
Read:开始读取操作,和第一个方法一样,但是不是异步操作,返回值是读到的字节数字,返回0代表,到达流的结尾,读完了。
Write :同理。
ReadAsync:取代了BeginRead
ReadByte:读取一个字节,并将流的位置提升一个字节,意思就是从你读完的地方接着读,不会从头读。
SetLength:设置当前流的长度。
Stream定义的基础方法就这么多,各种方法还有几个重载版本。详细了解的可以去看看MSDN官方文档。Stream类是一个抽象类,只定义方法在声明,具体实现由派生其的子类去实现。也就是接下来要要讲解的:
文件流FileStream
内存流 MemoryStream
和网络流NetWorkStream(System.Net.Sockets命名空间下,不同于之前两个)
3.FileStream流
using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Text; using System.Threading.Tasks; namespace IOTest { class Program { static void Main(string[] args) { //创建流实例。 FileStream filestrem = new FileStream(@"d:\一小时小超人.txt", FileMode.Create); string message = "我的名字叫:一小时小超人啊"; byte[] bytes = Encoding.UTF8.GetBytes(message); //写入字符串 filestrem.Write(bytes, 0, bytes.Length); } } }
这是时候我们去D盘可以发现我们已经成功写入了。但是这个地方有一个问题,首先我们将代码稍微改变一下。
using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Text; using System.Threading.Tasks; namespace IOTest { class Program { static void Main(string[] args) { //创建流实例。 FileStream filestream = new FileStream(@"d:\一小时小超人.txt", FileMode.Create); string message = "我的名字叫:一小时小超人啊"; byte[] bytes = Encoding.UTF8.GetBytes(message); //写入字符串 filestream.Write(bytes, 0, bytes.Length); Console.ReadKey(); } } }