C#编程中数据流的使用一直不很熟练,没有一个系统的认识,但是它的重要性显然不言而喻。System.IO下的Stream类是所有数据流的基类,当我们对数据进行逐字节操作时,首先需要将数据转换为数据流。C#数据流主要分为三类:FileStream、MemoryStream、NetworkStream,还有常用的StreamReader、StreamWriter和TextWriter类等。

  1.FileStream(文件流),继承Stream类。由名字可以看到这个类主要是对文件进行操作的。得到FileStream对象的常用方式有如下两种:

    FileStream fs=new FileStream(string path,FileMode mode,FileAccess access);//利用构造函数创建,FileMode枚举和FileAccess枚举这里就不总结了。

    FileStream fs=File.OpenWrite(@"C:\");//还有File.Open、File.OpenRead、File.OpenText都用的很多。

    得到FileStream对象后,调用常见的Read和Write方法即可进行读写,如果要读写比1kb字节大的文件时可以加个while循环来获得数据。

    //写文件流
    string str = "hh";
    byte[] bytes1 = new byte[1024];
    bytes1 = Encoding.UTF8.GetBytes(str);
    FileStream fst = new FileStream("sd", FileMode.OpenOrCreate, FileAccess.Write);
    fst.Write(bytes1, 0, bytes1.Length);
    //读文件流
    FileStream fs = File.OpenRead("sd");
    byte[] bytes2 = new byte[1024];
    int num = fs.Read(bytes2, 0, bytes2.Length);

  2.MemoryStream,内存流,它是以内存流的形式对内存中的字节数组进行操作,支持对数据流的查找和随机访问,和文件流一样可以使用Position属性得到内存流的当前位置。内存流的优点是对长度不定的数据进行缓存时,由于内存流是可以自动增长的,因此使用很方便。

    byte[] bytes=Encoding.UTF8.GetBytes("hh");
    using(MemoryStream ms=new MemoryStream())
    {
      ms.Write(bytes, 0, bytes.Length);
      byte[] byte2 = new byte[bytes.Length];
      ms.Position = 0;
      int n = ms.Read(byte2, 0, byte2.Length);
    }

  3.NetworkStream,网络流,这个流在网络编程里使用非常普遍。当客户端程序与服务器程序进行通信时数据的接受与发送就要用到这个类,有一点要特别注意,NetworkStream类仅仅只支持面向连接的套接字,比如使用TcpClient编写聊天程序时,只有服务器与客户端的TcpClient进行了连接后才能使用NetworkStream。得到NetworkStream对象创建好后就可以利用网络流对象进行网络数据的传递,但是网络流对象是没有Position对象的,无法指定起始位置来进行读写。还有NetworkStream对象的CanSeek属性始终返回false,使用Position和Seek方法会出现异常。

  得到NetworkStream对象有2种方式,一种是利用socket对象获得,一种是利用TcpClient对象来获得,后者我用的非常多。

    //写入数据到缓冲流

    NetworkStream ns=new NetworkStream(socket);

    NetworkStream ns=tcpClient.GetStream();

    if(ns.CanWrite)

    {

      byte[] bytes=Encoding.UTF8.GetBytes("hh");

      ns.Write(bytes,0,bytes.Length);

    }

    //读取数据
    if (ns.CanRead)
    {
      int num;
      byte[] bytes = new byte[1024];
      while (ns.DataAvailable)
      {
        num = ns.Read(bytes, 0, bytes.Length);
      }
    }

  很明显,在实际编程中如果使用字节数组来接受或发送数据太麻烦了,后来从网络编程老师那学到了两个非常好用的类BinaryReader类和BinaryWriter类。我们在实际通信中使用最多的还是字符串通信,只要得到NetworkStream对象后,就可以得到字符串读取流和写入流,比如以下代码

    TcpClient tcp = new TcpClient();
    NetworkStream networkStream = new NetworkStream();
    BinaryReader reader;
    BinaryWriter writer;
    string msg = "hh";
    networkStream = tcp.GetStream();
    writer = new BinaryWriter(networkStream);
    writer.Write(msg);//写字符串
    string str=reader.ReadString();//读字符串

  还有StreamReader类和StreamWriter类用的也是比较多,比如读一个txt文档读到末尾,可以调用StreamReader对象的ReadToEnd方法来拿到这个txt的所有字符串内容。另外如果要对发送的数据进行加密的话,有一个CryptoStream类用起来也挺方便的,在创建这个对象时可以直接就指定采用的对称加密算法,比如DES加密算法。解密时也非常方便,只需要使用和加密时相同的密钥创建CryptoStream实例,并在创建实例时指定CryptoStreamMode为读模式,即可拿到解密后的数据。

C#数据流的更多相关文章

  1. angular2系列教程(九)Jsonp、URLSearchParams、中断选择数据流

    大家好,今天我们要讲的是http模块的第二部分,主要学习ng2中Jsonp.URLSearchParams.observable中断选择数据流的用法. 例子

  2. 《连载 | 物联网框架ServerSuperIO教程》- 10.持续传输大块数据流的两种方式(如:文件)

    1.C#跨平台物联网通讯框架ServerSuperIO(SSIO)介绍 <连载 | 物联网框架ServerSuperIO教程>1.4种通讯模式机制. <连载 | 物联网框架Serve ...

  3. [LeetCode] Data Stream as Disjoint Intervals 分离区间的数据流

    Given a data stream input of non-negative integers a1, a2, ..., an, ..., summarize the numbers seen ...

  4. [LeetCode] Find Median from Data Stream 找出数据流的中位数

    Median is the middle value in an ordered integer list. If the size of the list is even, there is no ...

  5. React数据流和组件间的沟通总结

    今天来给大家总结下React的单向数据流与组件间的沟通. 首先,我认为使用React的最大好处在于:功能组件化,遵守前端可维护的原则. 先介绍单向数据流吧. React单向数据流: React是单向数 ...

  6. NTFS交换数据流隐写的应用

    by Chesky ##目录 ####一.NTFS交换数据流(ADS)简介 ####二.ADS应用 写入隐藏文件(文本\图像\可执行文件) ADS在Windows平台下的利用--写入后门 ADS在We ...

  7. SSIS Design6:利用数据流

    数据流利用内存来缓冲数据,并在内存中处理数据转换,由于内存的访问速度是非常快的,所以SSIS数据流转换性能是非常高效的.SSIS Engine将数据分批加载到内存中,当Data Flow将一批新的数据 ...

  8. Java基础知识笔记(三:文件与数据流)

    一.输入流与输出流 输入流将数据从文件.标准输入或其他外部输入设备中加载到内存.输出流的作用则刚好相反,即将在内存中的数据保存到文件中,或传输给输出设备.输入流在Java语言中对应于抽象类java.i ...

  9. C++系统预定义4个用于标准数据流对象

    C++系统预定义4个用于标准数据流对象 cin   cout   cerr   clog C++里关于cerr,clog,cout三者的区别: cerr(无缓冲标准错误)-----没有缓冲,发送给它的 ...

  10. hdfs的读写数据流

    hdfs的读:      首先客户端通过调用fileSystem对象中的open()函数读取他需要的的数据,fileSystem是DistributedFileSystem的一个实例, Distrib ...

随机推荐

  1. Codeforces441A_Valera and Antique Items(水题)

    Valera and Antique Items time limit per test 1 second memory limit per test 256 megabytes input stan ...

  2. 密码加密MD5,Bash64

    基于jar : org.apache.commons.codec 一.MD5概述:不可逆加密 Message Digest Algorithm MD5(中文名为消息摘要算法第 五版)为计算机安全领域广 ...

  3. MVC渲染文章内容的html标签转义

    文章详情页一般从数据库中取出文章内容,文章内容一般含有 等html标签,MVC中如果直接从模型输出文章内容,会把html标签转义变成<&gt等,这时候是要把转义后的标签变成html标签, ...

  4. [19/04/18-星期四] Java的动态性_动态编译(DynamicCompiler,Dynamic:动态的,Compiler:编译程序)

    一.概念 应用场景:如在线评测系统,客户端编写代码,上传到服务器端编译运行:服务器动态加载某些类文件进行编译 /*** * */ package cn.sxt.jvm; import java.io. ...

  5. javascript-对象搜索算法挑战

    对象搜索算法挑战 function where(collection, source) { var arr = []; var status = null; // What's in a name? ...

  6. ./redis-trib.rb 报错:/usr/local/rvm/gems/ruby-2.4.2/gems/redis-4.0.1/lib/redis/client.rb:119:in `call': ERR Slot 0 is already busy (Redis::CommandError)

    错误提示是 slot插槽被占用了(这是 搭建集群前时,以前redis的旧数据和配置信息没有清理干净.) 解决方案是 用redis-cli 登录到每个节点执行  flushall  和 cluster ...

  7. 前端基础-CSS是什么?

    阅读目录 一. 什么是CSS 二. 为何要用CSS 三. 如何使用CSS 一. 什么是CSS CSS全称Cascading Style Sheet层叠样式表,是专用用来为HTML标签添加样式的. 样式 ...

  8. 接入Gobelieve IM开发平台的DEMO代码

    接入Gobelieve IM开发平台的DEMO代码, 请求头部: Authorization: Basic $base64(appid:$hex_md5(appsecret))意思是 appsecre ...

  9. 轻量ORM-SqlRepoEx (十三)最佳实践

    ORM-SqlRepoEx 是 .Net平台下兼容.NET Standard 2.0,一个实现以Lambda表达式转转换标准SQL语句,使用强类型操作数据的轻量级ORM工具,在减少魔法字串同时,通过灵 ...

  10. python3爬虫-通过requests获取拉钩职位信息

    import requests, json, time, tablib def send_ajax_request(data: dict): try: ajax_response = session. ...