c# Stream基类

  • 什么是Stream?
  • 什么是字节序列呢?
  • Stream是如何使用的
  • 其它类型流简单的使用
    • FileStream
    • StreamReade、StreamWriter
    • MemoryStream

什么是Stream?

流就是提供字节序列的一般视图
(也有人理解的流是向自然界的河流那样清澈而又美丽,c#中的流也是一样,许多技术或者说核心技术都需要流的帮忙)

什么是字节序列呢?

其实字节序列就是字节对象都被存储为连续的字节序列,字节按照一定的顺序进行排序组成了字节序列
(形象得理解为:一条河中有一条鱼游过,这个鱼就是一个字节,这个字节包括鱼的眼睛,嘴巴,等组成8个二进制,显然这条河就是我们的核心对象:流)

Stream是如何使用的

Stream 类有一个protected 类型的构造函数, 但是它是个抽象类,无法直接如下使用

  1. CanRead: 只读属性,判断该流是否能够读取
  2. CanSeek: 只读属性,判断该流是否支持跟踪查找
  3. CanWrite: 只读属性,判断当前流是否可写
  4. Flush方法比较重要:
    当我们使用流写文件时,数据流会先进入到缓冲区中,而不会立刻写入文件,当执行这个方法后,缓冲区的数据流会立即注入基础流。MSDN中的描述:使用此方法将所有信息从基础缓冲区移动到其目标或清除缓冲区,或者同时执行这两种操作。根据对象的状态,可能需要修改流内的当前位置(例如:在基础流支持查找的情况下即如此)当使StreamWriter 或 BinaryWriter 类时,不要刷新 Stream 基对象。而应使用该类的 Flush 或 Close 方法,此方法确保首先将该数据刷新至基础流,然后再将其写入文件
  5. Length:表示流的长度
  6. Position属性(非常重要):
    虽然从字面中可以看出这个Position属性只是标示了流中的一个位置而已,很多asp.net项目中文件或图片上传中很多朋友会经历过这样一个痛苦:Stream对象被缓存了,导致了Position属性在流中无法找到正确的位置,这点会让人抓狂,其实解决这个问题很简单,聪明的你肯定想到了,其实我们每次使用流前必须将Stream.Position设置成0就行了,但是这还不能根本上解决问题,最好的方法就是用Using语句将流对象包裹起来,用完后关闭回收即可
  7. abstract int Read(byte[] buffer, int offset, int count)方法:
    这个方法包含了3个关键的参数:缓冲字节数组,位移偏量和读取字节个数,每次读取一个字节后会返回一个缓冲区中的总字节数
    第一个参数:这个数组相当于一个空盒子,Read()方法每次读取流中的一个字节将其放进这个空盒子中。(全部读完后便可使用buffer字节数组了)
    第二个参数:表示位移偏量,告诉我们从流中哪个位置(偏移量)开始读取。
    最后一个参数:就是读取多少字节数。
    返回值便是总共读取了多少字节数.
  8. abstract long Seek(long offset, SeekOrigin origin)方法:
    其实Seek方法就是重新设定流中的一个位置,在说明offset参数作用之前大家先来了解下SeekOrigin这个枚举:

    如果 offset 为负,则要求新位置位于 origin 指定的位置之前,其间隔相差 offset 指定的字节数。如果 offset 为零 (0),则要求新位置位于由 origin 指定的位置处
    如果 offset 为正,则要求新位置位于 origin 指定的位置之后,其间隔相差 offset 指定的字节数.
    Stream. Seek(-3,Origin.End); 表示在流末端往前数第3个位置
    Stream. Seek(0,Origin.Begin); 表示在流的开头位置
    Stream. Seek(3,Orig`in.Current); 表示在流的当前位置往后数第三个位置
    查找之后会返回一个流中的一个新位置
  9. abstract void Write(byte[] buffer,int offset,int count):
    这个方法包含了3个关键的参数:缓冲字节数组,位移偏量和读取字节个数和read方法不同的是 write方法中的第一个参数buffer已经有了许多byte类型的数据,我们只需通过设置 offset和count来将buffer中的数据写入流中
  10. virtual void Close():
    关闭流并释放资源,在实际操作中,如果不用using的话,别忘了使用完流之后将其关闭;这个方法特别重要,使用完当前流千万别忘记关闭

其它类型流简单的使用

FileStream

/// <summary>
/// 用FileStream1直接写入数据
/// </summary>
static void GetFileStream2()
{string content = @"<?xml version='1.0' encoding='utf-8'?>
<TAS>
<szUTCDate>20200807085759</szUTCDate>
<szTaDomain>POS</szTaDomain>
<szTaType>SA</szTaType>
<szTaOperationType>SALE</szTaOperationType>
<szInfo>0</szInfo>
<bNotPrinted>-1</bNotPrinted>
<lClientID>1</lClientID>
<szExternalClientID>CN</szExternalClientID>
<szClientName>CHINA</szClientName>
<szMode>POSMODE</szMode>
<szSessionID>6190:2:11343:2:20200807</szSessionID>
<szFooterLine1>HAVE A NICE DAY – 祝您购物愉快</szFooterLine1>
<szFooterLine2>美丽购物新捷径</szFooterLine2>
<szFooterLine3>退货规定</szFooterLine3>
<szFooterLine4>所有护肤,彩妆,香水产品, 一经售出,不予退换,过敏问题除外。</szFooterLine4>
<szFooterLine5>2.如使用产品过敏,请凭制定医院证明及原始购物小票办理退货,因化妆品有一定的使</szFooterLine5>
<szFooterLine6 Type='202'>3.门店不接受非本店售出商品的退换货。</szFooterLine6>
< szFooterLine7 Type = '202'> 4.商品退货时需退回相应的赠品,如赠品不能退回将酌情扣除部分退货金额。</ szFooterLine7 ></ TAS > ";string FilePath = @"E:\开发学习\流的认知\File\test.txt";FileStream sterm = new FileStream(FilePath, FileMode.Truncate, FileAccess.Write);byte[] byData = Encoding.UTF8.GetBytes(content); //建立一个FileStream要用的字节组sterm.Seek(10095, SeekOrigin.Begin); //指定从那个字节读数据sterm.Write(byData,0, byData.Length);sterm.Close();sterm.Dispose();
}/// <summary>
/// 用FileStream1直接读取数据
/// </summary>
static void GetFileStream1()
{string FilePath = @"E:\开发学习\流的认知\File\66619000200113962020080716543620200807085900.txt";FileStream sterm = new FileStream(FilePath, FileMode.OpenOrCreate, FileAccess.Read);byte[] byData = new byte[sterm.Length]; //建立一个FileStream要用的字节组sterm.Seek(0, SeekOrigin.Begin); //指定从那个字节读数据sterm.Read(byData, 0, byData.Length);#region 方法1.将字节组直接转换成utf8字符组//char[] charData = new char[byData.Length]; //建立一个字符组//Decoder d = Encoding.UTF8.GetDecoder();//d.GetChars(byData, 0, byData.Length, charData, 0); //将编码字节数组转换为字符数组#endregion#region 方法2.直接将字节组转换成utf8字符组string charData = Encoding.UTF8.GetString(byData);#endregionConsole.WriteLine(charData);sterm.Close();sterm.Dispose();
}

StreamReade、StreamWriter

 /// <summary>/// 用StreamWriter配合FileStream写入数据/// </summary>static void GetFileStream4(){string content = @"<?xml version='1.0' encoding='utf-8'?>
<TAS>
<szUTCDate>20200807085759</szUTCDate>
<szTaDomain>POS</szTaDomain>
<szTaType>SA</szTaType>
<szTaOperationType>SALE</szTaOperationType>
<szInfo>0</szInfo>
<bNotPrinted>-1</bNotPrinted>
<lClientID>1</lClientID>
<szExternalClientID>CN</szExternalClientID>
<szClientName>CHINA</szClientName>
<szMode>POSMODE</szMode>
<szSessionID>6190:2:11343:2:20200807</szSessionID>
<szFooterLine1>HAVE A NICE DAY – 祝您购物愉快</szFooterLine1>
<szFooterLine2>美丽购物新捷径</szFooterLine2>
<szFooterLine3>退货规定</szFooterLine3>
<szFooterLine4>所有护肤,彩妆,香水产品, 一经售出,不予退换,过敏问题除外。</szFooterLine4>
<szFooterLine5>2.如使用产品过敏,请凭制定医院证明及原始购物小票办理退货,因化妆品有一定的使</szFooterLine5>
<szFooterLine6 Type='202'>3.门店不接受非本店售出商品的退换货。</szFooterLine6>
< szFooterLine7 Type = '202'> 4.商品退货时需退回相应的赠品,如赠品不能退回将酌情扣除部分退货金额。</ szFooterLine7 ></ TAS > ";string FilePath = @"E:\开发学习\流的认知\File\test.txt";FileStream sterm = new FileStream(FilePath, FileMode.Truncate);StreamWriter sw = new StreamWriter(sterm);sw.Write(content);sw.Close();sw.Dispose();sterm.Close();sterm.Dispose();}/// <summary>/// 用StreamReader配合FileStream读取数据/// </summary>static void GetFileStream3(){string FilePath = @"E:\开发学习\流的认知\File\66619000200113962020080716543620200807085900.txt";FileStream sterm = new FileStream(FilePath, FileMode.Open);StreamReader sr = new StreamReader(sterm);#region 直接读取所有数据Console.WriteLine(sr.ReadToEnd());#endregion#region 一行一行的读取//string read = null;//while ((read = sr.ReadLine()) != null)//{//    Console.WriteLine(read);//}#endregionsr.Close();sr.Dispose();}

MemoryStream

/// <summary>
/// 用MemoryStream1写入数据
/// </summary>
static void GetMemoryStream1()
{string content = @"<?xml version='1.0' encoding='utf-8'?>
<TAS>
<szUTCDate>20200807085759</szUTCDate>
<szTaDomain>POS</szTaDomain>
<szTaType>SA</szTaType>
<szTaOperationType>SALE</szTaOperationType>
<szInfo>0</szInfo>
<bNotPrinted>-1</bNotPrinted>
<lClientID>1</lClientID>
<szExternalClientID>CN</szExternalClientID>
<szClientName>CHINA</szClientName>
<szMode>POSMODE</szMode>
<szSessionID>6190:2:11343:2:20200807</szSessionID>
<szFooterLine1>HAVE A NICE DAY – 祝您购物愉快</szFooterLine1>
<szFooterLine2>美丽购物新捷径</szFooterLine2>
<szFooterLine3>退货规定</szFooterLine3>
<szFooterLine4>所有护肤,彩妆,香水产品, 一经售出,不予退换,过敏问题除外。</szFooterLine4>
<szFooterLine5>2.如使用产品过敏,请凭制定医院证明及原始购物小票办理退货,因化妆品有一定的使</szFooterLine5>
<szFooterLine6 Type='202'>3.门店不接受非本店售出商品的退换货。</szFooterLine6>
< szFooterLine7 Type = '202'> 4.商品退货时需退回相应的赠品,如赠品不能退回将酌情扣除部分退货金额。</ szFooterLine7 ></ TAS > ";MemoryStream memory = new MemoryStream();byte[] array = Encoding.UTF8.GetBytes(content);//将字符串转化为字节数组memory.Seek(5000,SeekOrigin.Begin);memory.Write(array,0, array.Length);byte[] arrayNew = memory.ToArray();//将内存中的数据转换为字节数组string strNew = Encoding.UTF8.GetString(arrayNew);//将字节数组转换为字符串Console.WriteLine(strNew);memory.Close();memory.Dispose();//byte[] array = Encoding.UTF8.GetBytes(content);//将字符串转化为字节数组//MemoryStream memory = new MemoryStream(array);//初始化MemoryStream类//byte[] arrayNew = memory.ToArray();//将内存中的数据转换为字节数组//string strNew = Encoding.UTF8.GetString(arrayNew);//将字节数组转换为字符串//Console.WriteLine(strNew);//memory.Close();//memory.Dispose();
}

C# Stream(学习笔记)相关推荐

  1. 好程序员web前端分享Nodejs学习笔记之Stream模块

    好程序员web前端分享Nodejs学习笔记之Stream模块 一,开篇分析 流是一个抽象接口,被 Node 中的很多对象所实现.比如对一个 HTTP 服务器的请求是一个流,stdout 也是一个流.流 ...

  2. 【Java】函数式编程学习笔记——Stream流

    学习视频:https://www.bilibili.com/video/BV1Gh41187uR?p=1 (1)[Java]函数式编程学习笔记--Lambda表达式 (2)[Java]函数式编程学习笔 ...

  3. Stream 流 【学习笔记】Java 基础

    若文章内容或图片失效,请留言反馈. 部分素材来自网络,若不小心影响到您的利益,请联系博主删除. 写这篇博客旨在制作笔记,方便个人在线阅览,巩固知识,无其他用途. 学习视频 [黑马 Java 基础教程] ...

  4. SilverLight学习笔记--Silverlight中WebRequest通讯

    本文我们学习如何使用WebRequest类实现客户端和服务器端的通讯.      本例处理过程:在客户端,我们在文本框中输入任意文本,然后用POST方法向服务器端传递信息,服务器端收到从客户端传来的信 ...

  5. Python学习笔记(十一)

    Python学习笔记(十一): 生成器,迭代器回顾 模块 作业-计算器 1. 生成器,迭代器回顾 1. 列表生成式:[x for x in range(10)] 2. 生成器 (generator o ...

  6. Spring Cloud 学习笔记(四)-Spring Cloud Hystrix

    Spring Cloud 学习笔记(四)-Spring Cloud Hystrix 由于前一阵子项目的原因,今天才继续弄上,今天想学习一下Hystrix组件 这个组件还挺抽象的,最开始我一直没太明白, ...

  7. Spring Cloud Stream 学习小清单

    由于最近一直在写Spring Cloud Stream相关的内容,在2018年最后一天,把之前写过的Spring Cloud Stream内容从基础,到入门,到深入,做一些小清单,方便大家查阅. 如果 ...

  8. 不可错过的CMS学习笔记

    来源:dqVoice 引子 带着问题去学习一个东西,才会有目标感,我先把一直以来自己对CMS的一些疑惑罗列了下,希望这篇学习笔记能解决掉这些疑惑,希望也能对你有所帮助. CMS出现的初衷.背景和目的? ...

  9. python基础代码事例-学习笔记:python3,代码。小例子习作(2017)

    http://www.cnblogs.com/qq21270/p/7634025.html 学习笔记:python3,一些基本语句(一些基础语法的代码,被挪到这里了) 日期和时间操作 http://b ...

  10. Windows phone 8 学习笔记(5) 图块与通知

    基于metro风格的Windows phone 8 应用提到了图块的概念,它就是指启动菜单中的快速启动图标.一般一个应用必须有一个默认图块,还可以有若干个次要图块.另外,通知与图块的关系比较密切,我们 ...

最新文章

  1. 使用 Navicat Premium 将 sql server 的数据库迁移到 mysql 的数据库中
  2. 【Linux网络编程】套接字的介绍
  3. python取反函数_Python优雅的反函数int(string,base)
  4. oracle错误:1067进程意外终止
  5. placeholder的使用
  6. c 语言 封装dll_C#封装YOLOv4算法进行目标检测
  7. DataSetProvider的Option属性
  8. two day python基础知识
  9. c语言计算机二级常用库函数,2013年计算机二级C语言库函数的调用考点归纳
  10. 批处理bat schtasks 启动远程应用
  11. HDU2881 Jack's struggle (LIS)
  12. CAD图纸中文字字体特别粗看不清楚怎么办?
  13. 【微信小程序】java游戏后端开发
  14. 【C】 小球自由下落
  15. 工作流Airflow的性能优化,应对dag数目的激增
  16. 支付宝当面付参数获取步骤,个人申请使用支付宝当面付
  17. 使用理想低通滤波器对图像进行处理显示
  18. bzoj5197:[CERC2017]Gambling Guide
  19. 《head first sql》读书笔记1
  20. 微信小程序开发与mysql_微信小程序云开发之云数据库入门

热门文章

  1. OSChina 周一乱弹 ——理科生都是心灵鸡汤的克星
  2. 软件开发框架(更新中)
  3. 苹果公布穿戴设备进行跌倒检测专利,Find My技术堪称王炸
  4. 系统集成商业务发展的几点认识
  5. 【语音识别】拨号语音识别含Matlab源码
  6. php 小程序 运动步数_小程序同步微信步数 - xiangqian1的个人空间 - OSCHINA - 中文开源技术交流社区...
  7. MeteoInfoLab脚本示例:AIRS Swath HDF数据
  8. 首次启动nginx出错
  9. 使用TransMac制作OS X系统安装U盘
  10. 影驰gtx960 2g