使用MemoryStream和FileStream

使用MemoryStream和FileStream

编程访问文件是通过文件流对象进行的,当应用程序需要访问文件时,必须先创建一个文件流对象,此流对象和文件是一一对应关系。
在.NET中,使用抽象基类System.IO.Stream代表流,它提供Read和Write两个方法。由于数据流的有序性,因此流对象还有一个读写指针,为此,Stream类还有一个Seek方法用于移动读写指针。
FileStream对象的数据来自文件,而MemoryStream对象的数据来自内存缓冲区。这两个类都继承自Stream类。

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

在创建MemoryStream对象时,可以指定缓冲区的大小,并且可以在需要的时候更改。
//字节数组
        byte[] buffer = new byte[600];
//填充字节数组
        private void CreateExampleData()
        
{
            
for(int i=0; i<600; i++)
            
{
                
//byte类型的数最大不能超过255,用256取模实现
                 buffer[i] = (byte)(i%256);
             }
            
         }
内存流的基本使用方法:
private void OnTestMemory()
        
{
            
//创建测试数据
             CreateExampleData();
            
            
//创建内存流对象,初始分配50字节的缓冲区
             MemoryStream mem = new MemoryStream(50);

            
//向内存流中写入字节数组的所有数据
             mem.Write(buffer,0,buffer.GetLength(0));

             MessageBox.Show(
"写入数据后的内存流长度:" + mem.Length.ToString());
             MessageBox.Show(
"分配给内存流的缓冲区大小:" + mem.Capacity.ToString());

             mem.SetLength(
550);

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

             mem.Capacity
= 620;//此值不能小于Length属性
             MessageBox.Show("调用Capacity方法后缓冲区大小:" + mem.Capacity.ToString());

            
//将读写指针移到距流开头10个字节的位置
             mem.Seek(10,SeekOrigin.Begin);
             MessageBox.Show(mem.ReadByte().ToString());
             mem.Close();
         }
内存流的Length属性代表了其中存放的数据的真实长度,而Capacity属性则代表了分配给内存流的内存空间大小。
可以使用字节数组创建一个固定大小的MemoryStream,
MemoryStream mem = new MemoryStream(buffer);
这时,无法再设置Capacity属性的大小。
还可以创建只读的内存流对象。
MemoryStream mem = new MemoryStream(buffer,false);

FlieStream用于存取文件。
创建文件并写入内容:
//创建一个新文件
             FileStream fsForWrite = new FileStream("test.data",FileMode.Create);
            
try
            
{    
                
//写入一个字节
                 fsForWrite.WriteByte(100);
                 CreateExampleData();
                
//将字节数组写入文件
                 fsForWrite.Write(buffer,0,buffer.GetLength(0));
             }

            
catch(Exception ex)
            
{    
                 MessageBox.Show(ex.Message);
             }

            
finally
            
{
                
//关闭文件
                 fsForWrite.Close();
             }
打开文件并读取内容:
private void ReadFromFile()
        
{
             FileStream fsForRead
= new FileStream("test.data",FileMode.Open);
            
try
            
{
                
//读入一个字节
                 MessageBox.Show("文件的第一个字节为:"+fsForRead.ReadByte().ToString());
                
//读写指针移到距开头10个字节处
                 fsForRead.Seek(10,SeekOrigin.Begin);
                
byte[] bs = new byte[10];
                
//从文件中读取10个字节放到数组bs中
                 fsForRead.Read(bs,0,10);
             }

            
catch(Exception ex)
            
{    
                 MessageBox.Show(ex.Message);
             }

            
finally
            
{
                 fsForRead.Close();         }

         }
如果一个程序退出了,但它打开的文件没有被关闭,将导致其他程序无法修改或删除此文件。

转载于:https://www.cnblogs.com/MikeChen/archive/2010/05/28/1746005.html

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

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

相关文章

java servlet异步_厉害了,Servlet3的异步处理机制

Servlet3发布好几年了&#xff0c;又有多少人知道它的新特性呢&#xff1f;下面简单介绍下。主要增加了以下特性&#xff1a;1、异步处理支持2、可插性支持3、注解支持&#xff0c;零配置&#xff0c;可不用配置web.xml...异步处理是什么鬼&#xff1f;直接操起键盘干。WebServ…

WordPress后台的文章、分类,媒体,页面,评论,链接等所有信息中显示ID并将ID设置为第一列...

WordPress后台默认是不显示文章、分类等信息ID的&#xff0c;查看起来非常不方便,不知道Wp团队出于什么原因默认不显示这个但可以使用Simply Show IDs插件来实现 不使用插件,其他网友的实现&#xff1a; <?php /** *为WordPress后台的文章、分类等显示ID From wpdaxue.com …

进程调试--进程启动VS自动附加

程序启动VS自动附加到进程调试 1、 打开注册表regedit 2、 HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\currentversion\image file execution options 3、 新建QQ.exe【需要调试的进程名】 4、 右键修改字符串值 5、 F2修改新生成的默认值----debugger 6、右键debugger…

[转]20年来我得到的20条编程经验

1、解决问题时估算你所需要的时间。Cmon,admit it! 我曾见过一些程序员为了解决一个特殊的问题而连续坐在显示器前面8小时&#xff0c;我会像下一个会成为这样的程序员一样感到内疚。为自己定一个时间表吧&#xff0c;每1小时&#xff0c;30分钟&#xff0c;甚至15分钟。如果在…

Rotate List

Given a list, rotate the list to the right by k places, where k is non-negative. For example:Given 1->2->3->4->5->NULL and k 2,return 4->5->1->2->3->NULL. 注意下k>size的情况&#xff0c;即倒数的k%size个。 代码&#xff1a; c…

C#4.0和VS2010新特性(三)

VS2010之所以那么强大&#xff0c;究其原因是其背后有着强大的C#4.0作为后台支撑。和以往的所有版本相比&#xff0c;C#4.0的动态性大大增强——dynamic就是一个非常明显的例子&#xff1a;&#xff08;一&#xff09;dynamic初探&#xff1a; 以前因为某些特殊原因&#xff0c…

java spark环境配置文件_JAVA, SCALA, HADOOP, SPARK里的JAVA_HOME和环境变量设置

/etc/profile里添加的内容&#xff1a;export JAVA_HOME/jdkexport HADOOP_HOME/hadoopexport SCALA_HOME/scalaexport SPARK_HOME/sparkexport PATH$PATH:$JAVA_HOME/binexport PATH$PATH:$SPARK_HOME/binexport PATH$PATH:$HADOOP_HOME/binexport PATH$PATH:$SCALA_HOME/bine…

#20175201 实验五 网络编程与安全

一、实验五 网络编程与安全-1 1.实验要求&#xff1a; 两人一组结对编程&#xff1a; &#xff08;1&#xff09;参考http://www.cnblogs.com/rocedu/p/6766748.html#SECDSA &#xff1b; &#xff08;2&#xff09;结对实现中缀表达式转后缀表达式的功能 MyBC.java&#xff1b…

轻轻松松,一键获取3000个外链

轻轻松松&#xff0c;一键获取3000个外链 http://report.loganrockmarketing.com/backlinker/idx.html 打开以上网址&#xff1a; 在方框里输入你要推广的网址&#xff08;不要加前面的http://) 然后点击start/continue backlinking按钮 接下来&#xff0c;坐享其成吧。转载于:…

Scala学习思维导图

转载于:https://blog.51cto.com/thunderkeg/1605365

使用git上传代码到github远程仓库

一、新建代码库注册好github登录后&#xff0c;首先先在网页上新建代码库。 点击右上角“&#xff0b;”→New repository 进入如下页面&#xff1a;按照要求填写完成后&#xff0c;点击按钮创建代码库创建成功。 接下来我们查看一下刚刚创建好的代码库&#xff0c;点击右上角的…

java web开发myeclipse_【java项目实战】一步步教你使用MyEclipse搭建java Web项目开发环境(一)...

首先&#xff0c;在开始搭建MyEclipse的开发环境之前&#xff0c;还有三步工具的安装需要完成&#xff0c;只要在安装配置成功之后才可以进入下面的java Web项目开发环境的搭建。1、安装工具第一步&#xff0c;下载并安装JDK&#xff0c;到官网上下载安装即可&#xff0c;之后需…

对于大型公司项目平台选择j2ee的几层认识

对于大型公司项目平台选择j2ee的几层认识&#xff08;一&#xff09; 对于大型公司项目平台选择j2ee的几层认识&#xff08;二&#xff09; 对于大型公司项目平台选择j2ee的几层认识(三) 对于大型公司项目平台选择j2ee的几层认识(四)转载于:https://www.cnblogs.com/Wolves/arc…

当前项目规划

3.2、当前项目规划 完成项目最基本的用户权限管理&#xff0c;即添加用户&#xff0c;添加角色&#xff0c;用户登录后根据权限的不同获取不同的菜单。转载于:https://www.cnblogs.com/seem111111/p/10945125.html

java 常量池 和 堆 的关系_Java堆、栈和常量池以及相关String的详细讲解(经典中的经典)...

博客分类&#xff1a; Java综合一&#xff1a;在JAVA中&#xff0c;有六个不同的地方可以存储数据&#xff1a;1. 寄存器(register)。 这是最快的存储区&#xff0c;因为它位于不同于其他存储区的地方——处理器内部。但是寄存器的数量极其有限&#xff0c;所以寄存器由编译器根…

仿淘宝首页图片切换

资料来源:http://www.cnblogs.com/cloudgamer/archive/2008/07/06/SlideTrans.html?page2#pagedcomment 效果展示: 测试环境:IE8 (待续) 程序代码&#xff1a; 代码 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR…

docker高级应用之动态扩展容器空间大小

docker容器默认的空间是10G,如果想指定默认容器的大小&#xff08;在启动容器的时候指定&#xff09;&#xff0c;可以在docker配置文件里通过dm.basesize参数指定&#xff0c;比如docker -d --storage-opt dm.basesize20G是指定默认的大小为20G&#xff0c;具体参数可以参考ht…

关于ICallbackEventHandler的疑问

近日&#xff0c;由于需要&#xff0c;我写了一个webcontrol,并在实现了ICallbackEventHandler,目的是根据传进来的参数进行逻辑处理&#xff0c;然后返回值。我下面的例子目的是从1到5调用异步函数&#xff0c;然后在回调函数将1到5这几个数值相加。但是&#xff0c;由于调用异…

NIO学习--缓冲区

Buffer其实就是是一个容器对象&#xff0c;它包含一些要写入或者刚读出的数据。在NIO中加入Buffer对象&#xff0c;体现了新库与原I/O的一个重要区别。在面向流的I/O中&#xff0c;您将数据直接写入或者将数据直接读到Stream对象中。在NIO库中&#xff0c;所有数据都是用缓冲区…

二分图匹配之匈牙利算法

二分图的基本概念&#xff1a; 二分图又称作二部图&#xff0c;是图论中的一种特殊模型。 设G(V,E)是一个无向图&#xff0c;如果顶点V可分割为两个互不相交的子集(A,B)&#xff0c;并且图中的每条边(i&#xff0c;j)所关联的两个顶点i和j分别属于这两个不同的顶点集(i in A,j …