1. 综述
流用于对IO处理,在System.IO名称空间中有以下类:
BinaryReader/Writer
TextReader/Writer
Stream
其中类Stream为抽象类。由此有三个派生类:
MemoryStream:对内存进行读取与写入
BufferedStream:对缓冲器进行读取/写入
FileStream:对文件执行读取与写入
TextReader/Writer为抽象类。由此派生类:
StreamReader/StreamWirter
StringReader/StreamWrite
IO操作基本上需要用到Stream相关的子类。其实对于Stream来说,操作起来比较简单,只要对细节的处理稍微注意一下,相信在使用它的时候也可以得心应手。
2. 应用方法实例
内存流与缓冲流的使用举例:
static void Main(string[] args) { MemoryStream memStream=new MemoryStream(); //创建一个内存流对象 BufferedStream bufStream = new BufferedStream(memStream); //以一个内存流对象建立一个缓存流对象 byte[] b=new byte[10]; for(int i=0;i<10;i++) { bufStream.WriteByte((byte)i); //将一个字节写入缓存流的当前位置 } bufStream.Position=0; bufStream.Read(b, 0, 10); //将字节从当前缓冲流复制到数组 for(int i=0;i<10;i++) { Console.WriteLine("读取结果:{0}",b[i]); } Console.WriteLine("读取结果为:{0}", bufStream.ReadByte()); //从基础流中读取一个字节,并返回转换为 int 的该字节;或者如果从流的末尾读取则返回 -1。 Console.ReadLine(); }
输出结果:
文件流的使用:
static void Main(string[] args) { //文件流的使用: Console.WriteLine("请输入一个路径:"); string s=Console.ReadLine(); FileStream fileStream=new FileStream(s,FileMode.OpenOrCreate); BinaryWriter binStream=new BinaryWriter (fileStream); for(int i=1;i<=10;i++) { binStream.Write((int)i); //将 4 字节有符号整数写入当前流,并将流的位置提升 4 个字节。 } binStream.Close(); fileStream.Close(); FileStream f=new FileStream(s,FileMode.Open,FileAccess.Read,FileShare.ReadWrite); BinaryReader buf=new BinaryReader(f); for(int i=1;i<=10;i++) { Console.WriteLine("输出{0}",buf.ReadInt32()); //这样是可以的,因为int是32位的 } }
输出结果:
如果已知文件内只包含文本,我们可以使用StreamReader和StreamWriter类,这些类使对文本的操作变得很方便。例如他们支持ReadLine() and WriteLine() 方法,可以读取或输出一行文本。
应用实例:
static void Main() { FileInfo theSourceFile = new FileInfo(@"E:zzzProgram.cs"); StreamReader reader = theSourceFile.OpenText(); StreamWriter writer = new StreamWriter(@"E:zzz est1a.bak", false); // create a text variable to hold each line string text; do{// read every line writing both to the console and to the file text = reader.ReadLine(); writer.WriteLine(text); Console.WriteLine(text); } while (text != null); reader.Close(); writer.Close(); }
输出结果:(为文件E:zzzProgram.cs里面的内容)
3. 其他用法
C#异步文件 I/O
同步 I/O 意味着在 I/O 操作完成之前,方法被阻塞,I/O 操作完成后,方法返回其数据。使用异步 I/O,用户可以调用 BeginRead。主线程可以继续进行其他工作,稍后,用户将能够处理数据。另外,多个 I/O 请求可以被同时挂起。
如果想要在数据可用时得到通知,您可以调用 EndRead 或 EndWrite,传入与您发出的 I/O 请求对应的 IAsyncResult。您还可以提供回调方法,该回调方法应调用 EndRead 或 EndWrite 以计算读取或写入了多少字节。当许多 I/O 请求被同时挂起时,异步 I/O 可以提供较好的性能,但通常要求对您的应用程序进行一些重要的调整以使其正常工作。
Stream 类支持对同一流执行同步和异步混合读写,不论操作系统是否允许这样做。Stream 将以同步实现的名义提供异步读写操作的默认实现,并以异步实现的名义提供同步读写操作的默认实现。