C# Stream(学习笔记)
c# Stream基类
- 什么是Stream?
- 什么是字节序列呢?
- Stream是如何使用的
- 其它类型流简单的使用
- FileStream
- StreamReade、StreamWriter
- MemoryStream
什么是Stream?
流就是提供字节序列的一般视图
(也有人理解的流是向自然界的河流那样清澈而又美丽,c#中的流也是一样,许多技术或者说核心技术都需要流的帮忙)
什么是字节序列呢?
其实字节序列就是字节对象都被存储为连续的字节序列,字节按照一定的顺序进行排序组成了字节序列
(形象得理解为:一条河中有一条鱼游过,这个鱼就是一个字节,这个字节包括鱼的眼睛,嘴巴,等组成8个二进制,显然这条河就是我们的核心对象:流)
Stream是如何使用的
Stream 类有一个protected 类型的构造函数, 但是它是个抽象类,无法直接如下使用
- CanRead: 只读属性,判断该流是否能够读取
- CanSeek: 只读属性,判断该流是否支持跟踪查找
- CanWrite: 只读属性,判断当前流是否可写
- Flush方法比较重要:
当我们使用流写文件时,数据流会先进入到缓冲区中,而不会立刻写入文件,当执行这个方法后,缓冲区的数据流会立即注入基础流。MSDN中的描述:使用此方法将所有信息从基础缓冲区移动到其目标或清除缓冲区,或者同时执行这两种操作。根据对象的状态,可能需要修改流内的当前位置(例如:在基础流支持查找的情况下即如此)当使StreamWriter 或 BinaryWriter 类时,不要刷新 Stream 基对象。而应使用该类的 Flush 或 Close 方法,此方法确保首先将该数据刷新至基础流,然后再将其写入文件 - Length:表示流的长度
- Position属性(非常重要):
虽然从字面中可以看出这个Position属性只是标示了流中的一个位置而已,很多asp.net项目中文件或图片上传中很多朋友会经历过这样一个痛苦:Stream对象被缓存了,导致了Position属性在流中无法找到正确的位置,这点会让人抓狂,其实解决这个问题很简单,聪明的你肯定想到了,其实我们每次使用流前必须将Stream.Position设置成0就行了,但是这还不能根本上解决问题,最好的方法就是用Using语句将流对象包裹起来,用完后关闭回收即可 - abstract int Read(byte[] buffer, int offset, int count)方法:
这个方法包含了3个关键的参数:缓冲字节数组,位移偏量和读取字节个数,每次读取一个字节后会返回一个缓冲区中的总字节数
第一个参数:这个数组相当于一个空盒子,Read()方法每次读取流中的一个字节将其放进这个空盒子中。(全部读完后便可使用buffer字节数组了)
第二个参数:表示位移偏量,告诉我们从流中哪个位置(偏移量)开始读取。
最后一个参数:就是读取多少字节数。
返回值便是总共读取了多少字节数. - 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); 表示在流的当前位置往后数第三个位置
查找之后会返回一个流中的一个新位置 - abstract void Write(byte[] buffer,int offset,int count):
这个方法包含了3个关键的参数:缓冲字节数组,位移偏量和读取字节个数和read方法不同的是 write方法中的第一个参数buffer已经有了许多byte类型的数据,我们只需通过设置 offset和count来将buffer中的数据写入流中 - 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(学习笔记)相关推荐
- 好程序员web前端分享Nodejs学习笔记之Stream模块
好程序员web前端分享Nodejs学习笔记之Stream模块 一,开篇分析 流是一个抽象接口,被 Node 中的很多对象所实现.比如对一个 HTTP 服务器的请求是一个流,stdout 也是一个流.流 ...
- 【Java】函数式编程学习笔记——Stream流
学习视频:https://www.bilibili.com/video/BV1Gh41187uR?p=1 (1)[Java]函数式编程学习笔记--Lambda表达式 (2)[Java]函数式编程学习笔 ...
- Stream 流 【学习笔记】Java 基础
若文章内容或图片失效,请留言反馈. 部分素材来自网络,若不小心影响到您的利益,请联系博主删除. 写这篇博客旨在制作笔记,方便个人在线阅览,巩固知识,无其他用途. 学习视频 [黑马 Java 基础教程] ...
- SilverLight学习笔记--Silverlight中WebRequest通讯
本文我们学习如何使用WebRequest类实现客户端和服务器端的通讯. 本例处理过程:在客户端,我们在文本框中输入任意文本,然后用POST方法向服务器端传递信息,服务器端收到从客户端传来的信 ...
- Python学习笔记(十一)
Python学习笔记(十一): 生成器,迭代器回顾 模块 作业-计算器 1. 生成器,迭代器回顾 1. 列表生成式:[x for x in range(10)] 2. 生成器 (generator o ...
- Spring Cloud 学习笔记(四)-Spring Cloud Hystrix
Spring Cloud 学习笔记(四)-Spring Cloud Hystrix 由于前一阵子项目的原因,今天才继续弄上,今天想学习一下Hystrix组件 这个组件还挺抽象的,最开始我一直没太明白, ...
- Spring Cloud Stream 学习小清单
由于最近一直在写Spring Cloud Stream相关的内容,在2018年最后一天,把之前写过的Spring Cloud Stream内容从基础,到入门,到深入,做一些小清单,方便大家查阅. 如果 ...
- 不可错过的CMS学习笔记
来源:dqVoice 引子 带着问题去学习一个东西,才会有目标感,我先把一直以来自己对CMS的一些疑惑罗列了下,希望这篇学习笔记能解决掉这些疑惑,希望也能对你有所帮助. CMS出现的初衷.背景和目的? ...
- python基础代码事例-学习笔记:python3,代码。小例子习作(2017)
http://www.cnblogs.com/qq21270/p/7634025.html 学习笔记:python3,一些基本语句(一些基础语法的代码,被挪到这里了) 日期和时间操作 http://b ...
- Windows phone 8 学习笔记(5) 图块与通知
基于metro风格的Windows phone 8 应用提到了图块的概念,它就是指启动菜单中的快速启动图标.一般一个应用必须有一个默认图块,还可以有若干个次要图块.另外,通知与图块的关系比较密切,我们 ...
最新文章
- 使用 Navicat Premium 将 sql server 的数据库迁移到 mysql 的数据库中
- 【Linux网络编程】套接字的介绍
- python取反函数_Python优雅的反函数int(string,base)
- oracle错误:1067进程意外终止
- placeholder的使用
- c 语言 封装dll_C#封装YOLOv4算法进行目标检测
- DataSetProvider的Option属性
- two day python基础知识
- c语言计算机二级常用库函数,2013年计算机二级C语言库函数的调用考点归纳
- 批处理bat schtasks 启动远程应用
- HDU2881 Jack's struggle (LIS)
- CAD图纸中文字字体特别粗看不清楚怎么办?
- 【微信小程序】java游戏后端开发
- 【C】 小球自由下落
- 工作流Airflow的性能优化,应对dag数目的激增
- 支付宝当面付参数获取步骤,个人申请使用支付宝当面付
- 使用理想低通滤波器对图像进行处理显示
- bzoj5197:[CERC2017]Gambling Guide
- 《head first sql》读书笔记1
- 微信小程序开发与mysql_微信小程序云开发之云数据库入门