返回顶部
首页 > 资讯 > 后端开发 > 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://lsjlt.com/news/191293.html(转载时请注明来源链接)

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

猜你喜欢
  • 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
  • C#操作内存读写方法
    本篇内容主要讲解“C#操作内存读写方法”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C#操作内存读写方法”吧!C#操作内存读写方法是什么呢?让我们来看看具体的实例实现:using Sy...
    99+
    2023-06-17
  • 3-4 文件读写例子(3)
    u实验步骤(4): 向FileOption.cs文件中添加代码如下: //==============================第二部分:类设计============================&...
    99+
    2023-01-31
    例子 文件
  • mycat-3:读写分离
    利用mycat读写分离主库192.168.56.101,备库192.168.56.25.3个数据库db1,db2,db3.主从同步见之前数据库目录。 修改schema.xml balance="0"0:不开启读写分离机制,所有读操作都发送到...
    99+
    2023-01-31
    mycat
  • 计算机中运行内存8+3是什么意思
    这篇文章主要介绍了计算机中运行内存8+3是什么意思,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。运行内存8+3是物理内存8G,还有3G虚拟内存,和电脑一样,把存储空间划分处3...
    99+
    2023-06-20
  • mysql系列之8------读写分离
    一、前言:读写分离的基本原理       mysql的读写分离的基本原理是:让master(主数据库)来响应事务性操作,让slave(从数据库)来响应select非事...
    99+
    2024-04-02
  • 【8】python文件的读写方法
          (1)、读文件的步骤: (1)打开文件   open(path,flag,encoding,[errors])   path:打开路径   flag:打开方式 r(只读) rb(二进制格式) r+(可以读写...
    99+
    2023-01-30
    文件 方法 python
  • 3-4 文件读写例子
    3-3  文件读写例子 u本节学习目标: n学习通过文件流FileStream打开文本文件、写入文本文件、设置文件属性、实施对文件的目录操作管理的基本方法 n学习文件对话框的基本操作方法 n学习通过文...
    99+
    2023-01-31
    例子 文件
  • Python使用StringIO和BytesIO读写内存数据
    流读写 很多时候,数据读写不一定是文件,也可以在内存中读写。 1、StringIO:在内存中读写str。 要把str写入StringIO,我们需要先创建一个StringIO,然后,像...
    99+
    2024-04-02
  • PostgreSQL 源码解读(229)- Linux Kernel(进程虚拟内存#3)
    PostgreSQL使用进程架构,...
    99+
    2024-04-02
  • 如何解决XP内存读写错误(内存不能为read或written)
      当我们在计算机系统中运行一些容量较大的程序或者游戏时,系统常常会自动弹出“xx内存不能为read或written”的错误提示,遇到这种故障信息时,我们该如何才能将它有效排除,同时确保下次运行容...
    99+
    2023-05-29
    XP内存 读写错误 read 错误 内存 written XP
  • 3-6 读写二进制文件
    3-4  读写二进制文件 u本节学习目标: n了解二进制文件读取器/编写器 n学习建立BinaryReader类的一些主要方法 n学习建立BinaryWriter类的一些主要方法 n学习通过...
    99+
    2023-01-31
    二进制文件
  • 3-4 文件读写例子(4)
           /// <summary>                 public void ReadTextFile(string filepath, out Int16 i, out string ...
    99+
    2023-01-31
    例子 文件
  • 3-4 文件读写例子(2)
    //=========================第一部分:主界面功能设计============================= using System;...
    99+
    2023-01-31
    例子 文件
  • 让Windows XP不再出现内存读写错误
    计算机系统中运行一些容量较大的程序或者游戏时,系统常常会自动弹出“xx内存不能为 read或written”的错误提示,遇到这种故障信息时,我们该如何才能将它有效排除,同时确保下次运行容量较大的程...
    99+
    2023-05-24
    让Windows XP 不再出现 内存读写错误 内存 Windows
  • Hyper-V 3 动态内存
    动态内存管理是Hyper-V R2提供的一项新功能和特性,目前只有Windows Server 2008 R2 Service Pack 1((SP1)以上版本(Windows Server 2012)支持该功能,该功能能够自动平衡服务器上...
    99+
    2023-01-31
    内存 动态 Hyper
  • 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+
    2024-04-02
  • Centos7利用内存优化磁盘缓存读写速度的方法
    linux中的/dev/shm目录不属于磁盘,而是内存,如果使用/dev/shm/目录作为Linux中的磁盘文件读写缓存,可想效率是非常惊人的。 默认/dev/shm目录没有挂载,需要手动进行挂载。 在以下文件尾端添加以...
    99+
    2022-06-04
    Centos7 磁盘缓存读写 Centos7 优化磁盘读写速度
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作