C#数据流

  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为读模式,即可拿到解密后的数据。

时间: 2024-12-17 20:44:09

C#数据流的相关文章

Java中I/O流之数据流

Java 中的数据流: 对于某问题:将一个 long 类型的数据写到文件中,有办法吗?    转字符串 → 通过 getbytes() 写进去,费劲,而且在此过程中 long 类型的数需要不断地转换. 现在,Java 中的数据流能够很好的解决这个问题(不需要转换,直接写进去) 1. DataInputStream 与 DataOutputStream 分别继承自 InputStream.OutputStream, 它属于处理流,需要分别套接在 InputStream.OutputStream 类

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

大家好,今天我们要讲的是http模块的第二部分,主要学习ng2中Jsonp.URLSearchParams.observable中断选择数据流的用法. 例子 例子的第一个程序,上节课已经讲过了.这节课我们学习第二个程序,从wiki的api中跨域获取数据,可实现300毫秒内中断和选择最近请求等炫酷功能,这些功能都来自于observable! 运行方法: 在http目录或者上级目录起个服务即可: http-server 没有则需要安装http-server: sudo npm install htt

vue.js学习之组件数据流详解

本文和大家分享的主要是vue.js组件数据流相关内容,一起来看看吧,希望对大家学习vue.js有所帮助. 一.组件 组件,可以说是现代前端框架中必不可少的组成部分.使用组件,不仅能极大地提高代码的复用率和开发者的开发效率,对于代码后期的维护也有着非常重要的意义.前端开发,由于历史遗留原因,WebComponent 虽然好用,但其发展情况却受到极大地限制,和很多新兴的前端技术一样,可望而不可即.基于这样的情况,聪明的开发者们尝试通过框架内部集成相应的功能来完成组件化,各种现代前端框架基本上都有各自

数据流: DataInputStream 和 DataOutputStream

/* * 1.数据流: DataInputStream 和 DataOutputStream 一对. * 1) DataInputStream 数据的字节输入流: DataOutputStream 数据的字节输出流. * 2) 功能: 实现八种基本类型数据的输入/输出. 同时,也可实现字符串的输入/输出. * 3) 特点: 八种基本类型的数据在输入/输出时,会保持类型不变. * 因此,这种流特别适合在网络上实现基本类型数据和字符串的传递. * * 4) 方法: * readByte() writ

NTFS数据流编辑器NtfsStreamsEditor 2

NTFS是微软Windows NT内核的系列操作系统支持的.一个特别为网络和磁盘配额.文件加密等管理安全特性设计的磁盘格式.NTFS比FAT文件系统更加稳定,更加安全,功能也更为强大. 通过命令“convert 分区盘符: /fs:ntfs”,可将FAT格式分区的文件系统转换为NTFS文件系统. NTFS交换数据流(alternate data streams,简称ADS)是NTFS磁盘格式的一个特性,在NTFS文件系统下,每个文件都可以存在多个数据流,就是说除了主文件流之外还可以有许多非主文件

Java HttpURLConnection 以数据流写数据到Servlet

***************************************************    客户器端代码,响应请求流*************************************************** import java.io.*;import java.net.HttpURLConnection;import java.net.URL; public class StreamPostTest {    public static final String

MapReduce数据流

MapReduce的输入一般来自HDFS中的文件,这些文件分布存储在集群内的节点上.运行一个MapReduce程序会在集群的许多节点甚至所有节点上运行mapping任务,每一个mapping任务都是平等的:mappers没有特定“标识物”与其关联.因此,任意的mapper都可以处理任意的输入文件.每一个mapper会加载一些存储在运行节点本地的文件集来进行处理(译注:这是移动计算,把计算移动到数据所在节点,可以避免额外的数据传输开销). 当mapping阶段完成后,这阶段所生成的中间键值对数据必

TCP/IP详解学习笔记--TCP数据流

1.TCP的交互数据流 (1)基本概念 所谓交互数据流,其对TCP而言,就是他们所产生的大多数的TCP报文段中所包含的数据不超过10个字节,例如聊天等telnet的软件的TCP数据流就属于TCP交互数据流 (2)经受时延的确认 TCP收到数据时并不会马上发送数据,相反它会推迟数据的发送,以便让ack和该方向要发送的数据一起发送(搭个便车,不然ack就得自己自己组成一个数据段发送,这样有可能造成网络发生拥塞),但是如果此方向一直没数据发送,那么ack就得一直等下去?当然不会,系统会给其定一个最长等

数据流基本问题--确定频繁元素(二)

我们之前在数据流基本问题--确定频繁元素(一)中提到了频繁元素的一个计算问题(找出出现次数超过m/k的元素),里面的算法返回的结果里肯定包含出现次数超过m/k的元素,但是也可能包含不超过m/k的元素(false positive).对于这个缺点,必须得进行额外一次的重新扫描,以确定最终答案.我们只允许进行一次的扫描,那么该怎么去做呢?这里我们简单讨论下lossy counting算法. 其实问题是一样的,这里换个说法来叙述.我们定义两个参数,一个是支持度阈值s,一个是允许错误范围参数().如果我

数据流基本问题--确定频繁元素

下面可以谈论下如何求频繁元素的一个问题. 一.问题定义 如果一个数据流,其中m为数据流的大小,.我们可以定义每个元素出现的次数为,其中为第i个元素出现的次数.容易得出:. 如果给定参数k,我们想求出所有出现次数超过m/k的元素.也就是输出集合:.下面我们先从一个简单特例入手,对这个问题进行分析和解决. 二.简单情况 有个经典的过半元素查找问题,在编程之美里面也有分析(寻找发帖水王).就是说给定一个数组,找出出现次数超过一半的元素.对于这个问题一个比较好的做法就是不断删除两个不同的元素,最终剩下的