【转】C# 数据流详解(FileStream、MemoryStream、NetworkStream等类)

本文章内容主要为数据流及相关辅助类:

流(Stream)、文件流(FileStream)、内存流(MemoryStream)、网络流(NetworkStream)、加密流(CryptoStream)以及文本读写的StreamReader、StreamWriter、用于二进制读写的BinaryReader和BinaryWriter类等。

对FileStream、MemoryStream、NetworkStream有一定的了解即可,重点熟练StreaReader、StreamWriter、BinaryReader和BinaryWirter即可。

目录

数据流

数据流的操作

分类

Stream

FileStream

MemoryStream

NetworkStream

CryptoStream

StreamReader

StreamWriter

BinaryReader

BinaryWirter


数据流

数据流(data stream)是一组有序,有起点和终点的字节的数据序列。在C#里,数据流提供了一种通用的方式和字节队列进行交互。

数据流的操作

  • 逐字节顺序写入(将数据从内存缓冲传出到外部资源)
  • 逐字节顺序读取(将数据从外部数据资源传输到内存缓冲区)
  • 随机读写(从某个位置开始逐字顺序读写)

分类

  • 根据数据源的类型(C#语言采用这种方式进行分类)

分为文件流(FileStream)、内存流(MemoryStream)、网络流(NetworkStream)、加密流(CryptoStream)。

  • 根据读写数据的类型

分为字节流和字符流

  • 根据输入输出方向

输入流和输出流

Stream

流,在System.IO命名空间下,是所有数据流的基类,抽象类无法创建实例。

Position:获取或设置流当前的位置

Length:以字节为单位流的长度

CanWriter:当前流是否支持写入

CanTimeout:当前流是否超时

CanSeek:当前流是否支持查找,当CanSeek为false的时候,是不允许使用Position属性和调用Seek函数的,会抛出异常。

CanRead:当前流是否可读

Synckronized:根据当前流创建一个线程安全的的流对象

Close:关闭流并释放相关资源。

FileStream

文件流,在System.IO命名空间下,用于对各种类型的文件进行读写。

必须调用Dispose进行资源释放。

创建FileStream:FileStream构造函数之外,也可以通过File.OpenWrite和File.OpenRead创建FileStream对象

Flush:清除流的缓冲区,将已经缓冲的数据写入文件中。

Lock:锁定当前流,防止其他进程对文件进行读写。

UnLock:解除锁定,允许其他进程对文件进行读写。

SetLength:设置流的长度。

Read:读取一个一个字节块,并写入给定的缓冲区,offset是数组的偏移量,coun为读取的字节长度。每当读取一个字节后Position会增加1。放返回值为每次读取到的实际字节数。

Seek:设置流的偏移量,offset 偏移量,origin是指定偏移量的参考位置,开始位置、结束位置、当前位置。

MemoryStream

内存流,在System.IO命名空间下,对保存在内存中的字节数组进行操作。由于内存流的容量可以自动增长,因此在数据加密以及对长度不定的数据进行缓存等场合使用。

Capacity:获取或设置为此流分配的字节数

GetBuffer:获取流中的无符号字节数组,返回的是分配给流空间大小的字节数组(也就是Capacity大小的字节数组),而不是实际占用了的字节数组。

NetworkStream

网络流,在System.Net.Sockets命名空间下,利用该类可以通过网络发送或接收数据。可以将NetworkStream看作在数据源和接收端之间架设了一个数据通道,读取和写入就可以针对通道来进行。

NetworkStream仅支持面向连接的套接字,也就是采用TCP协议的连接。

创建NetworkStream:构造函数参数为Socket对象或调用TcpClient对象GetStream方法得到NetworkStream

Position:网络流无法访问该属性会抛出异常

CanSeek:始终返回false

Seek:网络流无法调用该函数会抛出异常。

DataAvailable:查看缓冲区(数据缓冲区)中是否有数据等待读出。

Write:将字节数组从进程缓冲区写入到TCP发送缓冲区,Write为同步方法,会阻塞线程直到发送成功或返回异常位置。

Read:将字节数组从TCP接收缓冲区读出到进程缓冲区,调用Read之前应先判断DataAvailable属性是否为true。

CryptoStream

加密流,在System.Security.Cryptography命名空间下,该类可加密流的方式加密或者解密数据,而且只能用于对称加密。

实现任何CryptoStream的任何被加密对象都可以和实现Stream的任何对象链接起来,因此一个对象的流式处理输出可以馈送到另一个对象的输入,而不需要分别存储中间结果。

Read:将需要解密的流写入到字节数组中,字节数组是已经解密的。

Write:将需要进行加密的流写入到字节数组中,字节数组中的数据是已经被加密的。

FlushFinalBlock:将内部缓冲区的数据进行写入并清空缓冲区。调用Flush无效。

StreamReader

继承自TextReader,在System.IO命名空间下。对文本数据进行读取操作时使用该类。

创建StreamReader:构造函数,参数使用FileStream、NetworkStream、MemoryStream的对象或使用文件路径。

Close:读写完成后必须使用CLose进行流的关闭.

BaseStream:获取对应的底层流,也就是创建StreamWriter或StreamReader时使用的Stream对象。

CurrentEncoding:获取当前流设置的编码格式。

ReadToEnd:从底层流的Position开始读取字符到结束为止

EndOfStream:获取底层流的Position是否为末尾为止。

StreamWriter

继承自TextWriter,在System.IO命名空间下。对文本数据进行写入操作时使用该类。

创建StreamWriter:除构造函数外,调用File.CreateText、FileInfo.CreateText均可以获取StreamWriter对象。

AutoFlush:是否在调用Write函数后自动调用Flush函数将字符缓冲到底层流。

Flush:清除当前写入器的所有缓冲区,并使任何已缓存的数据变写入底层流。

BinaryReader

在System.IO命名空间下,对图像文件、压缩文件等二进制数据进行读取操作时使用该类。

BinaryWirter

在System.IO命名空间下,对图像文件、压缩文件等二进制数据进行写入操作时使用该类。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/436889.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux命令英文全拼及含义解释

最近在做Linux开发。不同于使用Windows系统,使用linux开发经常会使用各种命令来和系统交互,特别是在偏嵌入式的环境下,没有GUI,就会更加依赖命令交互。 Linux命令通常是单词缩写,想要更好的记忆这些命令,最…

node工程默认url_node命令行工具之实现项目工程自动初始化的标准流程

一、目的传统的前端项目初始流程一般是这样:可以看出,传统的初始化步骤,花费的时间并不少。而且,人工操作的情况下,总有改漏的情况出现。这个缺点有时很致命。甚至有马大哈,没有更新项目仓库地址&#xff0…

【转】!C#中的Stream相关

计算机文件基本上分为二种:二进制文件和 ASCII(也称纯文本文件)。图形文件及文字处理程序等计算机程序都属于二进制文件。这些文件含有特殊的格式及计算机代码。ASCII 则是可以用任何文字处理程序阅读的简单文本文件,由一些字符的…

音频帧AVFrame::linesize大于实际值的问题记录

在解析AAC的音频流时,发现AVFrame::linesize[0]大小为8192。 但是AVFrame::nb_samples为1024,AVFrame::format类型为AV_SAMPLE_FMT_FLTP,即每个采样是4字节。 那么此音频帧中的数据应该为4096,和AVFrame::linesize[0]不相等。 …

vscode生成vue模板快捷键_vs code 快速生成vue 模板

1.使用快捷Ctrl Shift P唤出控制台,然后输入snippets并选择。(或 文件>首选项>用户代码片断里面,输入 vue.json ,然后回车 )(或 file > Preferences > User Snippets,然后回车)2.接着输入vue,选择vue-ht…

【转】!!c#文件系统操作类继承关系图

自己总结的,给大家参考一下,

FFmpeg资料

ffmpeg内存模型及AVPacket和AVFrame API解释

php elasticsearch 获取索引所有文档_Elasticsearch客户端主要方法的使用规则

安装1.在 composer.json 文件中引入 elasticsearch-php:{ "require": { "elasticsearch/elasticsearch": "~6.0" }}2.用 composer 安装客户端:curl -s http://getcomposer.org/installer | phpphp composer.…

【转】如何用好SVN的Branch

转自: http://www.cnblogs.com/lovebanyi/archive/2012/06/13/2547525.html 在SVN里面我们一般会创建出三个文件夹 Trunk(主干) Branch(分支) TAG(标签) 在我们项目一开始的时候我们会将代码…

python数据爬取并可视化_Python爬取数据并实现可视化代码解析

这次主要是爬了京东上一双鞋的相关评论:将数据保存到excel中并可视化展示相应的信息主要的python代码如下:文件1#将excel中的数据进行读取分析import openpyxlimport matplotlib.pyplot as pit #数据统计用的wkopenpyxl.load_workbook(销售数据.xlsx)she…

【转】SVN trunk(主线) branch(分支) tag(标记) 用法详解和详细操作步骤

转自:https://monday.blog.csdn.net/article/details/51122637 一:使用场景: 假如你的项目(这里指的是手机客户端项目)的某个版本(例如1.0版本)已经完成开发、测试并已经上线了,接…

纠正一个可能的错误翻译—交叉编译

交叉编译,是英文 Cross Compilation 的中文翻译。 下面摘自百度: 交叉编译是在一个平台上生成另一个平台上的可执行代码。 由于嵌入式设备的性能局限,往往不能通过本机编译得到所需软件的可执行程序。因此,以Linux为主机操作系统…

jar 退出run_Java终止线程的三种方式

停止一个线程通常意味着在线程处理任务完成之前停掉正在做的操作,也就是放弃当前的操作。在 Java 中有以下 3 种方法可以终止正在运行的线程:使用退出标志,使线程正常退出,也就是当 run() 方法完成后线程中止。使用 stop() 方法强…

【转】人工智能教程-前言

前言 大家好!欢迎来到我的网站! 人工智能被认为是一种拯救世界、终结世界的技术。毋庸置疑,人工智能时代就要来临了,科幻电影中的场景将成为现实,未来已来! 我很庆幸。十四年前就认定了人工智能专业&…

golang 包含 数组_Golang数组类型

数组数组是指一系列同一类型数据的集合。数组中包含的每个数据被称为数组元素(element),一个数组包含的元素个数被称为数组的长度。1. 声明方法[32]byte //长度为32的数组[2*N] struct {x, y int32} //复杂类型数组[100]*float64 //指针数组[3][5]int //二维数组[2]…

【转】人工智能-1.1.1 什么是神经网络

1.1.1 什么是神经网络 什么是人工智能?通俗来讲,就是让机器能像人一样思考。这个无需解释太多,因为通过各种科幻电影我们已经对人工智能很熟悉了。大家现在感兴趣的应该是——如何实现人工智能? 从1956年夏季首次提出“人工智能…

【V4L2】学习资料

预备知识 V4L2,即Linux视频设备内核驱动。 参考文章 v4l2的学习建议和流程解析Linux V4L2学习高通msm-V4L2-Camera驱动浅析5-buffer00_video_decode (video decode):此内容为英伟达Jetson的Demo文档手册,有条件的可以结合Jetson的代码阅读…

解决margin塌陷的问题_解决margin塌陷与margin合并(margin)清除浮动问题

**1、margin塌陷**问题:垂直方向的父子关系的盒子使用不当会产生margin塌陷。给子级设置margin-top时,他不会相对父级一起动,只有他的margin超过父级的margin时,才会生效,但会带着父级一起动(作者总结,官方…

【转】人工智能-1.2.2 神经网络是如何进行预测的

上一篇文章中我们已经知道了如何将数据输入到神经网络中。那么神经网络是如何根据这些数据进行预测的呢?我们将一张图片输入到神经网络中,神经网络是如何预测这张图中是否有猫的呢?? 这个预测的过程其实只是基于一个简单的公式&a…