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. css3 圣诞红包雨效果

    <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...

  2. 用Web技术开发客户端(一)

    http://www.cnblogs.com/lefan/archive/2012/12/27/2836400.html 范怀宇(@duguguiyu)分享了<豌豆荚2.0重构时遇到的坑> ...

  3. UVa 11971 - Polygon(几何概型 + 问题转换)

    链接: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...

  4. 【NOIP2014】解方程

    题目描述 已知多项式方程 \[a_0 + a_1x + a_2x^2 + \dots +a_nx^n=0\] 求这个方程在\([1,m]\)内的整数解(\(n\)和\(m\)均为正整数). 输入输出格 ...

  5. git 如何忽略文件以及使用.gitignore 不生效的解决办法

    (1) git 如何忽略文件 在git中如果想忽略掉某个文件,不让这个文件提交到版本库中,可以使用修改根目录中 .gitignore 文件的方法(如无,则需自己手工建立此文件).这个文件每一行保存了一 ...

  6. Css3 实现丝带效果

    代码如下: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF ...

  7. FreeMarker之根据模板生成Java代码

    FreeMarker根据模板生成Java代码,光这句话,大家想必也知道它的应用了,比如流行的DRY原则,该原则的意思,可简单概述为"不要写重复的代码". 比如Java中三层架构,数 ...

  8. Content Editor Webpart(三)使用JSOM

    JSOM是SharePoint 提供的一种clientAPI.开发者仅仅须要使用Javescript.就能够实现和SharePoint的交互.很方便. 首先依照 (Content Editor Web ...

  9. Linux Shell常用技巧(八)

    十八.  和系统运行状况相关的Shell命令:    1.  Linux的实时监测命令(watch):    watch 是一个非常实用的命令,可以帮你实时监测一个命令的运行结果,省得一遍又一遍的手动 ...

  10. java二维码工具类,中间带LOGO的,很强大

    jar包下载maven 配置: Xml代码 收藏代码 <dependency> <groupId>com.google.zxing</groupId> <ar ...