当前位置:网站首页>C# IO Stream 流(一)基础概念_基本定义
C# IO Stream 流(一)基础概念_基本定义
2022-06-25 22:03:00 【天马3798】
一、C# Stream 流基础概念
概念:提供了字节序列的通用视图,是一个抽象类。
数据流(Stream)是对串行传输的一种抽象表示,是对输入/输出的一种抽象。数据有来源和目的地,衔接两者的就是串流对象。
流具有如下3种基本操作:
写入:将数据从内存缓冲区传输到外部源;
读取:将数据从外部源传输到内存缓冲区;
查找:重新设置流的当前位置,以便随机读写。但并不是所有的流类型都支持查找,如网络流类没有当前位置的概念,就不支持查找。
二、C# Stream 流基本定义,常用属性和方法
Stream是虚拟类,它以及它的派生类都提供了Read和Write方法,可以支持在字节级别上对数据进行读写。Read方法从当前字节流读取字节放至内存缓冲区,Write方法把内存缓冲区的字节写入当前流中。
属性:
1:CanRead:只读属性,判断该流是否能够读取
2:CanSeek:只读属性,判断该流是否支持跟踪查找
3:CanSeek:只读属性,判断该流是否可写
4.Length:表示流的长度
5.Position属性
虽然从字面中可以看出这个Position属性只是标示了流中的一个位置而已,可是我们在实际开发中会发现这个想法会非常的幼稚,
很多asp.net项目中文件或图片上传中很多朋友会经历过这样一个痛苦:Stream对象被缓存了,导致了Position属性在流中无法
找到正确的位置,这点会让人抓狂,其实解决这个问题很简单,聪明的你肯定想到了,其实我们每次使用流前必须将Stream.Position
设置成0就行了,但是这还不能根本上解决问题,最好的方法就是用Using语句将流对象包裹起来,用完后关闭回收即可。
方法:
1.void Flush()
当我们使用流写文件时,数据流会先进入到缓冲区中,而不会立刻写入文件,当执行这个方法后,缓冲区的数据流会立即注入基础流
MSDN中的描述:使用此方法将所有信息从基础缓冲区移动到其目标或清除缓冲区,或者同时执行这两种操作。根据对象的状态,可能需要修
改流内的当前位置(例如,在基础流支持查找的情况下即如此)当使用 StreamWriter 或 BinaryWriter 类时,不要刷新 Stream 基对象。
而应使用该类的 Flush 或 Close 方法,此方法确保首先将该数据刷新至基础流,然后再将其写入文件。
2: virtual void Close()
关闭流并释放资源,在实际操作中,如果不用using的话,别忘了使用完流之后将其关闭
这个方法特别重要,使用完当前流千万别忘记关闭!
3:abstract int Read(byte[] buffer ,int offset ,int count)
这个方法包含了3个关键的参数:缓冲字节数组,位移偏量和读取字节个数,每次读取一个字节后会返回一个缓冲区中的总字节数
第一个参数:这个数组相当于一个空盒子,Read()方法每次读取流中的一个字节将其放进这个空盒子中。(全部读完后便可使用buffer字节数组了)
第二个参数:表示位移偏量,告诉我们从流中哪个位置(偏移量)开始读取。
最后一个参数:就是读取多少字节数。
返回值便是总共读取了多少字节数.
4.abstract void Write(byte[] buffer,int offset,int count)
这个方法包含了3个关键的参数:缓冲字节数组,位移偏量和读取字节个数
和read方法不同的是 write方法中的第一个参数buffer已经有了许多byte类型
的数据,我们只需通过设置 offset和count来将buffer中的数据写入流中
5. abstract long Seek(long offset,Seek)
大家还记得Position属性么?其实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); 表示在流的当前位置往后数第三个位置
查找之后会返回一个流中的一个新位置。其实说道这大家就能理解Seek方法的精妙之处了吧。
更多:
C#数组分组_C#数据分组_C# Linq分组使用整理
C# 中的可用类型_不可用类型_C#双问号_C#问号点_C# null不等于
C# 数据类型、变量、作用域
边栏推荐
- Xinchida nd04 nd04c nrf52832 (52810) ble module (low power Bluetooth communication module) at command test
- 转载: QTableWidget详解(样式、右键菜单、表头塌陷、多选等)
- CSDN添加页内跳转和页外指定段落跳转
- CAD中图纸比较功能怎么用
- 库项目和App项目中清单文件的包名不要相同
- Analysis on the control condition and mode of go cooperation overtime exit
- #23class介绍
- [Axi] interpretation of Axi protocol atomic access
- 漏刻有时API接口实战开发系列(13):小鹅通云服务PHP-API二维数组传参解决方案
- CXF
猜你喜欢
1.8 billion pixel Mars panorama Ultra HD released by NASA, very shocking
音频基础知识以及PCM转WAV
期末复习【机器学习】
录屏转gif的好用小工具ScreenToGif,免费又好用!
How to use drawing comparison function in CAD
UE4 学习记录一 创建角色,并控制其移动
qtcreator 格式化代码
YUV444、YUV422、YUV420、YUV420P、YUV420SP、YV12、YU12、NV12、NV21
Summary of common JDBC exceptions and error solutions
The simplest screen recording to GIF gadget in history, licecap, can be tried if the requirements are not high
随机推荐
Visual studio code create minimal web API (asp.net core)
Episode 3: thread synchronization using thread lock
CAD中图纸比较功能怎么用
C2. k-LCM (hard version)-Codeforces Round #708 (Div. 2)
Day4 branch and loop summary and operation
Qt Utf8 与 Unicode 编码的互相转换, Unicode编码输出为格式为 &#xXXXX
B. Box Fitting-CodeCraft-21 and Codeforces Round #711 (Div. 2)
YUV444、YUV422、YUV420、YUV420P、YUV420SP、YV12、YU12、NV12、NV21
CSDN force value
QComboBox下拉菜单中有分隔符Separator时的样式设置
期末复习【机器学习】
OBS-Studio-27.2.4-Full-Installer-x64. Exe Download
CTS RTS RX TX in serial port flow control UART (direct communication between serial port module and MCU)
[2023 proofreading and bidding questions] Part 1: Measurement Technology FPGA post (roughly analytical version)
Database - mongodb
Download the latest V80 version of Google Chrome
社招两年半10个公司28轮面试面经(含字节、拼多多、美团、滴滴......)
C. Planar Reflections-CodeCraft-21 and Codeforces Round #711 (Div. 2)
The software test interview has been suspended. The interviewer always says that the logical thinking is chaotic. What should I do?
CSDN原力值