首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

C# 温故而知新:Stream篇(五)上

,为系统内存提供读写操作,由于MemoryStream是通过无符号字节数组组成,可以说MemoryStream性能可以 算比较出色,所以担当起了一些其他流进行数据交换时中间工作,同时可降低应用程序对临时缓冲区和临时文件需要...count<=8, 其实8这个数字在流很关键,个人认为微软为了性能需要而这样写:当字节小于8时则一个个读,当字节大于八时则用block拷贝方式,在这个范围内递减循环 将数据写入流缓冲_buffer...方法进行数组复制,不同于Array.Copy 前者是采用内存位移而非索引位移所以性能上有很大提升。...内存计算页也称为计算型内存页,主要用于存放程序代码和临 时使用数据 进程虚拟地址:每一个进程被给予非常私有的虚拟地址空间。...count, bool writeable, bool publiclyVisible) publiclyVisible 参数表示true 可以启用 GetBuffer方法,返回无符号字节数组,流从该数组创建

1.2K50

3-8 读写内存

3-5-1 读写内存流 ——MemoryStream类 类MemoryStream创建这样流,该流以内存不是磁盘或网络连接作为支持存储区。...类MemoryStream封装以无符号字节数组形式存储数据,该数组创建MemoryStream对象时被初始化,或者该数组创建为空数组。可在内存中直接访问这些封装数据。...nMemoryStream数据来自内存一块连续区域,这块区域称为“缓冲区(Buffer)”。可以把缓冲区看成一个数组,每个数组元素可以存放一个字节数据。...可以使用字节数组创建一个固定大小MemoryStream。...//3、count最多写入字节数。             //GetLength(0) 为 GetLength 一个示例,返回 Array 第一维元素个数。

90620
您找到你想要的搜索结果了吗?
是的
没有找到

Stream 流操作

FileStream 缓冲输入和输出来更好性能。 MemoryStream 类 (创建其后备存储区为内存流。) MemoryStream创建具有内存而非磁盘或网络连接作为后备存储区流。...MemoryStream 封装作为无符号字节数组存储数据,该数据创建 MemoryStream 对象时初始化,或者该数组可以创建为空数组。可在内存中直接访问这些封装数据。...内存流可降低应用程序对临时缓冲区和临时文件需要。 用无符号字节数组创建内存流提供无法调整大小数据流。...当使用字节数组时,虽然根据传递到构造函数参数可能能够修改现有内容,但既不能追加也不能收缩流。空内存流是可调整大小,而且可以向其写入和从中读取。...查看StreamReader构造函数可以看出其实是需要一个stream主体即使没有要求出入,也会隐式创建一个同样需要指定一个编码方式,如果没有指定则使用默认编码方式(默认值代表没有) 来至

95520

C#使用MemoryStream类读写内存

这两个类都是实现对内存进行数据读写功能,不是对持久性存储器进行读写。 读写内存-MemoryStreamMemoryStream类用于向内存不是磁盘读写数据。...MemoryStream封装以无符号字节数组形式存储数据,该数组创建MemoryStream对象时被初始化,或者该数组创建为空数组。可在内存中直接访问这些封装数据。...内存流可降低应用程序对临时缓冲区和临时文件需要。 下表列出了MemoryStream重要方法: 1、Read():读取MemoryStream流对象,将值写入缓存区。...2、ReadByte():从MemoryStream读取一个字节。 3、Write():将值从缓存区写入MemoryStream流对象。...Read方法使用语法如下: mmstream.Read(byte[] buffer,offset,count) 其中mmstream为MemoryStream一个流对象,3个参数,buffer包含指定字节数组

2.8K10

.NET基础拾遗(3)字符串、集合和流

在实际开发,经常会对数据进行处理,不可避免地会遇到字符串和字节数组相互转换需求。...使用了字符串驻留池机制之后,当CLR启动时,会在内部创建一个容器,该容器内部维持了一个类似于key-value对数据结构,其中key是字符串内容,value则是字符串在托管堆上引用(也可以理解为指针或地址...例如,在一系列用户界面操作之后,系统后台可能会得到一个DateTime数组现在任务则是将它们存储到数据数据库访问层提供接口只接受String[]参数,这时我们要做就是把DateTime...流是一种针对字节操作,类似于内存与文件之间一个管道。...在实际开发,我们经常会遇到需要传递一个比较大文件,或者事先无法得知文件大小(Length属性抛出异常),因此也就不能创建一个尺寸正好合适Byte[]数组,此时只能分批读取和写入,每次只读取部分字节

1.9K10

.NET Core.NET之Stream简介

数组不同是, 数组是把所有的数据都一同放在了内存里, stream则是顺序/连续处理数据, 要么是一次处理一个字节, 要么是一次处理特定大小(不能太大, 可管理范围内)数据....Read方法把stream一块数据写入到数组, 返回接受到字节数, 总是小于等于count这个参数....对于不可寻址Stream(例如加密Stream), 想知道长度只能是把读完. 而且你要是想读取前一部分的话必须关闭stream, 然后再开始一个全新stream才可以....在内存压缩 有时候需要把整个压缩都放在内存里, 这就要用到MemoryStream: byte[] data = new byte[1000]; // 对于空数组, 我们可以期待一个很好压缩比率...这里第一个using走完时候MemoryStream会被关闭, 所以只能使用ToArray方法来提取数据.

1.9K51

C#图像压缩相关方法总结

线程池 实现线程池具体思路是:先创建指定数量线程,然后通过死循环不断地从一个数组读取图片进行压缩,直到结束。...WaitHandle,通过创建独占资源来避免同时访问,这里我们可以利用它“忙则等待”特性,在子线程独占某个资源,结束后释放这些资源,主线程就会因为资源被其它线程占用进入等待,直到全部子线程都结束才能继续运行...//创建一个内存MemoryStream memoryStream = new MemoryStream(); //把Bitmap写入到内存 bitmap.Save(memoryStream, imageFormat...); //摧毁内存memoryStream.Dispose(); 现在我们可以定义一个函数,用它来计算Bitmap以指定格式输出到内存大小 public static long LengthOfBitmapInMemory...Dispose(); } } 考虑到写入数据大部分都是固定,所以我把文件标头和数据段保存为一个byte数组,下次只需要先写入这个数组,然后通过偏移修改相关字段数据就可以了 //标头和数据数组

86940

C#文件

文件 ----   文件 是一个存储在磁盘带有指定名称和目录路径数据集合。当打开文件进行读写时,变成一个流。   从根本上说,流是通过通信路径传递字节序列。有两个主要流:输入流 和输出流。...; //将要写内容存入字节数组 fs.Write(data,0,data.Length); //写入字节数据 fs.Flush(); fs.Close(); //关闭文件 使用StreamReader...我们在文件读写已经介绍了文件流,像FileStream,在这里我们再来介绍一下MemoryStream类,继承自Stream类。   MemoryStream类用于向内存不是磁盘读写数据。...MemoryStream封装以无符号字节数组形式存储数据,该数组创建MemoryStream对象时被初始化,或者该数组创建为空数组。可在内存中直接访问这些封装数据。...ReadByte():从MemoryStream读取一个字节。 Write():将值从缓存区写入MemoryStream流对象。

1K50

.NET Core装饰模式和.NET CoreStream

数组不同是, 数组是把所有的数据都一同放在了内存里, stream则是顺序/连续处理数据, 要么是一次处理一个字节, 要么是一次处理特定大小(不能太大, 可管理范围内)数据....Read方法把stream一块数据写入到数组, 返回接受到字节数, 总是小于等于count这个参数....对于不可寻址Stream(例如加密Stream), 想知道长度只能是把读完. 而且你要是想读取前一部分的话必须关闭stream, 然后再开始一个全新stream才可以....注意: Close和Flush 一个MemoryStream是可选. 如果关闭了MemoryStream, 你就再也不能对读写了, 但是仍然可以调用ToArray方法来获取其底层数据....BufferedStream BufferedStream对另一个stream进行装饰或者说包装, 让拥有缓冲能力.它也是众多装饰stream类型一个.

991130

运行时序列化 1

序列化是将对象或对象图转成字节过程。 反序列化是将字节流转换回对象或对象图过程。 序列化与反序列化意义 1. 把对象图状态保存到文件或数据,在下次需要时候可以还原。 2....因为序列化过程可能会抛出异常并终止程序,所以我们可以先将对象图序列化到MemoryStream,保证序列化能够顺利完成,然后再将字节复制到希望目标流(文件流和网络流) 将Serializable...如果序列化类型实例,在类型添加了新字段,然后试图反序列包含新字段数据,格式化器会抛出异常。这不利于版本控制,幸运是,我们可以使用OptionalFieldAttribute特性声明新字段。...这样就不会因为流数据包含这个字段抛出异常了。 格式化器如何序列化类型实例?...格式化器根据流包含数据创建并初始化一个object[]数组对象。 5.

45320

.NET性能优化-使用RecyclableMemoryStream替代MemoryStream

今天给大家带来这个优化技巧其实就是池化MemoryStream版本RecyclableMemoryStream,通过池化MemoryStream底层buffer来降低内存占用率、GC暂停时间和GC...大型池有两个版本:线性(默认):指定一个倍数和最大大小,然后创建一个缓冲区数组,从(1x倍数)、(2x倍数)一直到最大值。指数:缓冲区不是线性增长而是指数增长,每个槽大小将增加一倍。...您有责任确保它们内容是有效和安全,可以使用缓冲区回收。使用指南虽然这个库力求非常通用化,并且不会对如何使用它施加太多限制,但是目的是减少由于频繁大量分配产生垃圾收集成本。...即我应该保留多少空闲字节以备不时之需?我在要使用机器上有哪些物理内存限制?...要知道在我们性能评测,RecyclableMemoryStream比MemoryStream快51%,而且它能节省99.4%内存分配。

51130

.NET性能优化-使用RecyclableMemoryStream替代MemoryStream

今天给大家带来这个优化技巧其实就是池化MemoryStream版本RecyclableMemoryStream,通过池化MemoryStream底层buffer来降低内存占用率、GC暂停时间和GC...大型池有两个版本: 线性(默认):指定一个倍数和最大大小,然后创建一个缓冲区数组,从(1x倍数)、(2x倍数)一直到最大值。 指数:缓冲区不是线性增长而是指数增长,每个槽大小将增加一倍。...您有责任确保它们内容是有效和安全,可以使用缓冲区回收。 使用指南 虽然这个库力求非常通用化,并且不会对如何使用它施加太多限制,但是目的是减少由于频繁大量分配产生垃圾收集成本。...即我应该保留多少空闲字节以备不时之需? 我在要使用机器上有哪些物理内存限制?...要知道在我们性能评测,RecyclableMemoryStream比MemoryStream快51%,而且它能节省99.4%内存分配。

36610

《CLR via C#》笔记:第4部分 核心机制(4)

反序列化是将字节流转换回对象图过程。在对象和字节流之间转换是很有用机制。(P541 1) 一旦将对象序列化成内存字节流,就可方便地以一些更有用方式处理数据,比如进行加密和压缩。...4、格式化器然后遍历两个数组元素,将每个成员名称和值写入流。...如果程序集当前没有加载到AppDomain,就加载。如果程序集不能加载,就抛出一个SerializationException异常,对象不能反序列化。...4、格式化器根据流包含数据创建并初始化一个Object数组 5、将新分配对象、MemberInfo 数组以及并行Object 数组(其中包含字段值)引用传给FormatterServices 静态方法...例如,如果对象包装了Windows信号量(semaphore)对象,如果知道要反序列化到同一个进程,就可决定对内核句柄(kernel handle)进行序列化,这是因为内核句柄在一个进程中有效

34020

使用C# (.NET Core) 实现装饰模式 (Decorator Pattern) 并介绍 .NETCoreStream

数组不同是, 数组是把所有的数据都一同放在了内存里, stream则是顺序/连续处理数据, 要么是一次处理一个字节, 要么是一次处理特定大小(不能太大, 可管理范围内)数据....Read方法把stream一块数据写入到数组, 返回接受到字节数, 总是小于等于count这个参数....对于不可寻址Stream(例如加密Stream), 想知道长度只能是把读完. 而且你要是想读取前一部分的话必须关闭stream, 然后再开始一个全新stream才可以....注意: Close和Flush 一个MemoryStream是可选. 如果关闭了MemoryStream, 你就再也不能对读写了, 但是仍然可以调用ToArray方法来获取其底层数据....BufferedStream BufferedStream对另一个stream进行装饰或者说包装, 让拥有缓冲能力.它也是众多装饰stream类型一个.

47020

用.NET Core实现装饰模式和.NET CoreStream简介

数组不同是, 数组是把所有的数据都一同放在了内存里, stream则是顺序/连续处理数据, 要么是一次处理一个字节, 要么是一次处理特定大小(不能太大, 可管理范围内)数据....Read方法把stream一块数据写入到数组, 返回接受到字节数, 总是小于等于count这个参数....对于不可寻址Stream(例如加密Stream), 想知道长度只能是把读完. 而且你要是想读取前一部分的话必须关闭stream, 然后再开始一个全新stream才可以....注意: Close和Flush 一个MemoryStream是可选. 如果关闭了MemoryStream, 你就再也不能对读写了, 但是仍然可以调用ToArray方法来获取其底层数据....BufferedStream BufferedStream对另一个stream进行装饰或者说包装, 让拥有缓冲能力.它也是众多装饰stream类型一个.

1.3K50

浅谈WebService开发(一)

二、创建WebService ? 创建WebService之后,我们就可以在文件里写返回数据方法了。...三、返回数据四种形式 笔者水平有限,只列出这四种数据返回形式:   (1)直接返回DataSet对象   (2)返回DataSet对象用Binary序列化后字节数组   (3)返回DataSetSurrogate...对象用Binary序列化后 字节数组   (4)返回DataSetSurrogate对象用Binary序列化并Zip 压缩后字节数组 理论上来说,网络传输字节与传输时间,应该是递减,其中,(3)...WebService效果,如图,在这个页面,有提供四个方法,这四个方法就是上述我们写四个返回数据方法了,点击方法即可返回相应数据,这样,我们数据提供方代码就可以写好了,接下来,我们写调用数据方法...调用四个方法效果是一样,唯一不同是,传输过程数据量大小和传输时间差异。

83030

.NET密码学–对称加密

意思是,任何时候你都可以实现而且可以使用对称算法加密或者解密你数据,为了加密或者解密你数据你必须定义一个密码或者一个密钥。下面描述了对称加密特性。 加密强度依赖于你密钥(密码)。...这个密钥被配置成使用字节数组。 IV:数据处理时候使用初始化向量(上面已经描述)。配置成字节数组。 KeySize:密钥所有位大小。...现在让我们从内存得到数据代码。 // 数据已经写入内存但是我们需要回显到TextBox和MessageBox,因此要做下面的工作。 // 为接受数据创建字节数组。...// 现在让我们从内存得到解密后数据 // 因为我们数据内存,所以我们需要重新使用MemoryStream对象。...你可以创建对象(使用新变量)。然后我们为了从内存读取数据需要StreamReader对象。

78710

c#网络模块

1数据包 在传输网络数据时候,接收方一次收到数据长度可能是不确定,比如客户端发送了100个字节给服务器,服务器有可能一次收到100个字节,也可能先收到20个,再收到80个。...为了知道到底一个数据长度是多少,我们将首先创建一个类,用于管理序列化数据流,序列化、反序列化对象。...NetPacket这个类提供功能主要包括两部分:一部分是将序列化数据写入,并加入4个字节作为数据“头”;另一部分是从byte数组前4个字节解析数据长度,再读取相应长度数据。...(T t) { byte[] bs; using (System.IO.MemoryStream stream = new System.IO.MemoryStream...stream, t); bs = stream.ToArray(); } return bs; } 2.byte数组写入数据

11720

14-IO流

输入流作用就是读取数据内存 按照流内容来分 字节流:流数据最小单位是一个一个字节,这个流就是字节流 字符流:流数据最小单位是一个一个字符,这个流就是字符流 FileInputStream...-文件字节输入流 以内存为基准,将磁盘文件数据按照字节形式读入到内存流,简单来说,就是按照字节读取文件数据内存 构造器 public FileInputStream(File path):创建一个字节输入流管道与源文件对象接通...,把内存数据,按照字节形式写出到磁盘中去,简言之,就是把内存数据按照字节写出到磁盘中去 构造器 public FileOutputStream(File file):创建一个字节输出流管道通向目标文件对象...如果想要追加数据不是覆盖,只需要在创建管道时,设置管道第二个参数为true即可(第二个参数表示是否为追加数据管道) 字节流做文件复制 字节是计算机中文件存储最基本单位,所以字节流适合做一切文件复制...复制是把源文件全部字节一个不漏全部转移到目标文件,只要保证前后格式一样,绝对不会出现错误 步骤 创建一个字节输入流管道与源文件接通 创建一个字节输出流管道与目标文件接通 创建一个字节数组作为中间传递媒介

22320

.NET Winform图像与Base64格式互转

我们可以创建一个Windows窗体应用程序项目来演示,然后从Visual Studio工具箱中将图片框,标签和按钮拖到Winform,然后设计一个简单UI,该UI允许您从硬盘中选择图像...,然后进行转换如下图所示,将图像转换为base64字符串或将编码后base64字符串转换为c#image。...private void Form1_Load(object sender, EventArgs e) { } //要将图像转换为base64字符串,可以创建一个...; } } //将base64字符串转换为字节数组,然后写入内存流,最后从该流返回图像。...Base64互转小工具,意义在于进行图像相关数据传输时,可以不再需要直接把图像地址作为参数传输,取而代之是用Base64字符串作为参数传入,如此操作可以显著降低操作系统资源消耗。

1.8K40
领券