广告
返回顶部
首页 > 资讯 > 后端开发 > Python >3-8 读写内存流
  • 264
分享到

3-8 读写内存流

内存 2023-01-31 07:01:10 264人浏览 八月长安

Python 官方文档:入门教程 => 点击学习

摘要

3-5  读写内存流 u本节学习目标: n了解读写内存流MemoryStream的特点 n学习如何建立内存流MemoryStream n了解读写缓存流BufferedStream n学习如何

3-5  读写内存流

u本节学习目标:

n了解读写内存流MemoryStream的特点
n学习如何建立内存流MemoryStream
n了解读写缓存流BufferedStream
n学习如何建立缓存流BufferedStream
前面第二节,介绍了文件流类FileStream,本节要继续介绍其他流。那么什么是流?在.net程序中,涉及的输入和输出都是通过流来实现的。流是串行化设备的抽象表示,流以读/写字节的方式从存储器读/写数据。存储器是存储媒介,磁盘或内存都是存储器。正如除磁盘外还存在着多种存储器,除文件流之外也存在多种流,例如:网络流、内存流、缓存流等。类Stream及其派生类组成流的家族。如图3-12所示:

 
图3-12  流家族类关系图

所有流的类都是从类Stream派生出来的。类Stream是所有流的抽象基类,所以它不能被实例化为对象,只能通过变量引用派生类的对象。Stream变量所引用对象具有一下一种或多种功能:
n读:通过Read()或ReadByte()方法实现读数据;

n写:通过Write()或WriteByte()方法实现写数据;

n定位:通过Position属性和Seek()方法实现定位。

 
注意:

派生的流对象只能支持这些功能中的一部分。例如:NetworkStream不支持定位。可以利用从Stream派生出来的对象的CanRead、CanWrite和CanSeek属性判断流对象支持哪些操作。

另外,对于类MemoryStream,有两点需要说明:

n对内存而不是对磁盘进行数据读写;

n减少了对临时缓冲区和文件的需要。

而对于类BufferedStream,有四点需要说明:

n对缓冲区进行数据读写;

n允许操作系统创建自己的缓冲区;

n输入/输出效率高且速度更快;

n在网络通讯的时候经常会使用到。

3-5-1 读写内存流 ——MemoryStream类

类MemoryStream创建这样的流,该流以内存而不是磁盘或网络连接作为支持存储区。类MemoryStream封装以无符号字节数组形式存储的数据,该数组在创建MemoryStream对象时被初始化,或者该数组可创建为空数组。可在内存中直接访问这些封装的数据。内存流可降低应用程序中对临时缓冲区和临时文件的需要。
 FileStream对象与MemoryStream对象有很大区别,主要体现在以下方面:

nFileStream对象的数据来自文件,而MemoryStream对象的数据来自内存缓冲区。这两个类都继承自Stream类。

nMemoryStream的数据来自内存中的一块连续区域,这块区域称为“缓冲区(Buffer)”。可以把缓冲区看成一个数组,每个数组元素可以存放一个字节的数据。

n在创建MemoryStream对象时,可以指定缓冲区的大小,并且可以在需要的时候更改。

    类MemoryStream的构造函数有7种重载,我们这里重点介绍三种,如表3-16所示:

表3-16 类MemoryStream的常用构造函数

名称

说明

MemoryStream ()

使用初始化为零的可扩展容量初始化 MemoryStream 类的新实例。

MemoryStream (byte[])

基于指定的字节数组初始化 MemoryStream 类的无法调整大小的新实例。

MemoryStream (byte[], Boolean)

使用按指定要求设置的 CanWrite 属性基于指定的字节数组初始化 MemoryStream 类的无法调整大小的新实例。

    内存流对象还有一些重要的属性。其中Length属性代表了内存流对象存放的数据的真实长度,而Capacity属性则代表了分配给内存流的内存空间大小。可以使用字节数组创建一个固定大小的MemoryStream。
 
n小实验1:

 

MemoryStream mem = new MemoryStream(buffer);

//这时,无法再设置Capacity属性的大小。

 
n小实验2:

 

MemoryStream mem = new MemoryStream(buffer, false);

//这时,CanWrite属性就被设置为false 。

这样在内存流对象被实例化时,一些属性就被影响了。

3-5-2   MemoryStream类案例学习

1.  案例学习:MemoryStream类案例

本案例您将学习到:如何通过使用内存流的属性、方法来获取内存流的占用空间信息及改变内存流空间大小。
u实验步骤(1):

由图3-13所示,从工具箱之中拖拽五个Label控件到FORM窗体上,拖拽一个Button控件。

图3-13  MemoryStream类案例界面图
u实验步骤(2):

用鼠标双击所有Button控件,进入.cs文件编辑状态准备进行开发。代码加下:
using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Text;

using System.windows.Forms;

using System.IO;

 

namespace FileOptionApplication

{

    public partial class Form14 : Form

    {

        public Form14()

        {

            InitializeComponent();

        }

        //建立字节数组

        byte[] buffer = new byte[600];

        /// <summary>

        /// 获取测试性数据

        /// </summary>

        private void GetTestData()

        {

            for (int i = 0; i < 600; i++)

            {

                buffer[i] = (byte)(i % 256);

                //byte类型的数最大不能超过255,用256取模实现

            }

        }

        /// <summary>

        /// button1按钮的鼠标单击Click事件

        /// </summary>

        private void button1_Click(object sender, EventArgs e)

        {

            //创建测试数据

            GetTestData();

            //创建内存流对象,初始分配50字节的缓冲区

            MemoryStream mem = new MemoryStream(50);

            //向内存流中写入字节数组的所有数据

            mem.Write(buffer,0,buffer.GetLength(0));

            //使用从缓冲区读取的数据将字节块写入当前流。

            //参数:

            //1、buffer从中写入数据的缓冲区。

            //2、offset buffer中的字节偏移量,从此处开始写入。

            //3、count最多写入的字节数。

            //GetLength(0) 为 GetLength 的一个示例,它返回 Array 的第一维中的元素个数。

            label1.Text = "写入数据后的内存流长度是:"+mem.Length.ToString();

            label2.Text = "分配给内存流的缓冲区大小:"+mem.Capacity.ToString();

            mem.SetLength(500);

            label3.Text = "调用SetLength方法后的内存流长度:" + mem.Length.ToString();

            mem.Capacity = 620;//注意:此值不能小于Length属性

            label4.Text = "调用Capacity方法后缓冲区大小:" + mem.Capacity.ToString();

            //将读写指针移到距流开头10个字节的位置

            mem.Seek(45, SeekOrigin.Begin);

            label5.Text = "内存中的信息是:"+mem.ReadByte().ToString();

        }

    }

}

u实验步骤(3):

调试、运行程序,得到效果如图3-14所示:
图3-14  MemoryStream类案例运行效果图

3-5-3  读写缓存流 ——BufferedStream类

类BufferedStream就是给另一流上的读写操作添加一个缓冲区。缓冲区是内存中的字节块,用于缓存数据,从而减少对操作系统的调用次数。因此,缓冲区可提高读取和写入性能。使用缓冲区可进行读取或写入,但不能同时进行这两种操作。BufferedStream 的Read和Write方法自动维护缓冲区的读写过程。
BufferedStream可写在某些类型的流周围。它提供从基础数据源或储存库读取字节以及将字节写入基础数据源或储存库的实现。使用BinaryReader和BinaryWriter读取和写入其他数据类型。BufferedStream用于在不需要缓冲区时防止缓冲区降低输入和输出速度。如果您读取和写入的大小始终大于内部缓冲区的大小,那么BufferedStream可能甚至无法分配内部缓冲区。
BufferedStream也在共享缓冲区中缓冲读取和写入。假设您几乎始终执行一系列读取或写入操作,而很少在读取和写入之间切换。类BufferedStream的构造函数有2种重载,如表3-17所示:
表3-17 类BufferedStream的常用构造函数

名称

说明

BufferedStream (Stream)

使用默认的缓冲区大小 4096 字节初始化 BufferedStream 类的新实例。

BufferedStream (Stream, Int32)

使用指定的缓冲区大小初始化 BufferedStream 类的新实例。

--结束END--

本文标题: 3-8 读写内存流

本文链接: https://www.lsjlt.com/news/191293.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 3-8 读写内存流
    3-5  读写内存流 u本节学习目标: n了解读写内存流MemoryStream的特点 n学习如何建立内存流MemoryStream n了解读写缓存流BufferedStream n学习如何...
    99+
    2023-01-31
    内存
  • 3-9 读写缓存流 ——Buffered
    3-5-3  读写缓存流 ——BufferedStream类 类BufferedStream就是给另一流上的读写操作添加一个缓冲区。缓冲区是内存中的字节块,用于缓存数据,从而减少对操作系统的调用次数。因此,缓冲区可提高读取和写入性...
    99+
    2023-01-31
    缓存 Buffered
  • 计算机中运行内存8+3是什么意思
    这篇文章主要介绍了计算机中运行内存8+3是什么意思,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。运行内存8+3是物理内存8G,还有3G虚拟内存,和电脑一样,把存储空间划分处3...
    99+
    2023-06-20
  • C#操作内存读写方法
    本篇内容主要讲解“C#操作内存读写方法”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C#操作内存读写方法”吧!C#操作内存读写方法是什么呢?让我们来看看具体的实例实现:using Sy...
    99+
    2023-06-17
  • PostgreSQL 源码解读(229)- Linux Kernel(进程虚拟内存#3)
    PostgreSQL使用进程架构,...
    99+
    2022-10-18
  • Python使用StringIO和BytesIO读写内存数据
    流读写 很多时候,数据读写不一定是文件,也可以在内存中读写。 1、StringIO:在内存中读写str。 要把str写入StringIO,我们需要先创建一个StringIO,然后,像...
    99+
    2022-11-11
  • 如何解决XP内存读写错误(内存不能为read或written)
      当我们在计算机系统中运行一些容量较大的程序或者游戏时,系统常常会自动弹出“xx内存不能为read或written”的错误提示,遇到这种故障信息时,我们该如何才能将它有效排除,同时确保下次运行容...
    99+
    2023-05-29
    XP内存 读写错误 read 错误 内存 written XP
  • 让Windows XP不再出现内存读写错误
    计算机系统中运行一些容量较大的程序或者游戏时,系统常常会自动弹出“xx内存不能为 read或written”的错误提示,遇到这种故障信息时,我们该如何才能将它有效排除,同时确保下次运行容量较大的程...
    99+
    2023-05-24
    让Windows XP 不再出现 内存读写错误 内存 Windows
  • Python如何使用StringIO和BytesIO读写内存数据
    本文小编为大家详细介绍“Python如何使用StringIO和BytesIO读写内存数据”,内容详细,步骤清晰,细节处理妥当,希望这篇“Python如何使用StringIO和BytesIO读写内存数据”文章能帮助大家解决疑惑,下面跟着小编的...
    99+
    2023-06-30
  • Java基础字符编码与内存流详细解读
    目录1、字符编码1.1 常用字符编码1.2 乱码产生分析2、内存流基本操作3、打印流3.1 格式化文本信息4、 System类4.1 系统输出4.2 系统输出4.3 系统输入5、Bu...
    99+
    2022-11-12
  • Centos7利用内存优化磁盘缓存读写速度的方法
    linux中的/dev/shm目录不属于磁盘,而是内存,如果使用/dev/shm/目录作为Linux中的磁盘文件读写缓存,可想效率是非常惊人的。 默认/dev/shm目录没有挂载,需要手动进行挂载。 在以下文件尾端添加以...
    99+
    2022-06-04
    Centos7 磁盘缓存读写 Centos7 优化磁盘读写速度
  • Android手机内存中文件的读写方法小结
    本文实例总结了Android手机内存中文件的读写方法。分享给大家供大家参考。具体分析如下: 如何对手机内存中的文件数据进行读写呢? Context提供了领个方法来打开该应用程序...
    99+
    2022-06-06
    小结 方法 Android
  • C#中怎么利用MemoryStream类对内存进行读写
    C#中怎么利用MemoryStream类对内存进行读写,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。读写内存-MemoryStream类MemoryStream类用于向内存...
    99+
    2023-06-17
  • 如何让XP系统不再出现内存读写错误
    当我们在计算机系统中运行一些容量较大的程序或者游戏时,系统常常会自动弹出“xx内存不能为read或written”的错误提示,遇到这种故障信息时,我们该如何才能将它有效排除,同时确保下次运行容量较...
    99+
    2023-06-01
    XP系统 内存 系统 XP
  • 怎样让XP系统不再出现内存读写错误
    本篇文章为大家展示了怎样让XP系统不再出现内存读写错误,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。当我们在计算机系统中运行一些容量较大的程序或者游戏时,系统常常会自动弹出“xx内存不能为read或...
    99+
    2023-06-14
  • XP系统出现内存读写错误内存不能为read或written的排查步骤
    当我们在计算机系统中运行一些容量较大的程序或者游戏时,系统常常会自动弹出“xx内存不能为read或written”的错误提示,遇到这种故障信息时,我们该如何才能将它有效排除,同时确保下次运行容量较...
    99+
    2023-06-01
    内存读写错误 内存不能为read 内存 read 系统 排查 XP
  • 万字长文教你使用安卓内核驱动进行内存读写
    你是不是经常看到一些游戏辅助声称自己独家内核驱动,支持一切机型,无视游戏检测。本文将带领你,从0开始,编译属于自己的安卓内核驱动。通过本文:你将从一名初级的游戏辅助开发者,摇身一变成为所谓的独家内核作...
    99+
    2023-09-05
    linux 安全 android
  • XP系统出现内存读写错误的详细解决方法
    当我们在计算机系统中运行一些容量较大的程序或者游戏时,系统常常会自动弹出“xx内存不能为read或written”的错误提示,遇到这种故障信息时,我们该如何才能将它有效排除,同时确保下次运行容量较...
    99+
    2023-06-01
    内存 XP系统 解决 XP 方法
  • Win7虚拟内存设置技巧 快速提升其读写速度
    为了解决这个问题,Windows运用了虚拟内存技术,即拿出一部分硬盘空间来充当内存使用,这部分空间即称为虚拟内存,虚拟内存在硬盘上的存在形式就是PAGEFILE.SYS这个页面文件。  虚拟内存只是真实内存不足的补充,所...
    99+
    2023-05-25
    Win7 虚拟内存 速度
  • XP系统出现内存读写错误内存不能为read或written的排查步骤是怎样的
    XP系统出现内存读写错误内存不能为read或written的排查步骤是怎样的,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。当我们在计算机系统中运行一些容量较大的程序或者游戏...
    99+
    2023-06-14
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作