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

  • 相关阅读:
    解决Thread 的关闭问题
    使用.NET实现断点续传
    如何将int类型数据转换成byte数组
    怎么样读取Excel表格中的数据(C#.Net)
    .NET平台下WEB应用程序的部署(安装数据库和自动配置)
    ASP.NET程序中常用的三十三种代码
    C#中的类型转换
    解决StreamReader读取中文出现乱码的问题
    C#下的Raw Socket编程实现网络封包监视
    利用键盘钩子在Windows平台下捕获键盘动作
  • 原文地址:https://www.cnblogs.com/yongheng20/p/4494906.html
Copyright © 2020-2023  润新知