zoukankan      html  css  js  c++  java
  • 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 将以同步实现的名义提供异步读写操作的默认实现,并以异步实现的名义提供同步读写操作的默认实现。

  • 相关阅读:
    Leetcode:169. 多数元素
    关系数据库
    数据库系统概述——简单总结
    Leetcode:1305. 两棵二叉搜索树中的所有元素
    Leetcode春季打卡第四天:994. 腐烂的橘子
    临界区和临界资源的关系
    线程2.线程的应用场景
    线程
    linux下的进程控制
    Go中的错误处理
  • 原文地址:https://www.cnblogs.com/yongheng20/p/4494906.html
Copyright © 2011-2022 走看看