C#学习(八)- Stream

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 将以同步实现的名义提供异步读写操作的默认实现,并以异步实现的名义提供同步读写操作的默认实现。

原文地址:https://www.cnblogs.com/yongheng20/p/4494906.html