第15篇 文件流和内存流的学习总结
来源:互联网 发布:算法时代 下载 编辑:程序博客网 时间:2024/05/17 01:16
原来一起对文件流、内存流相关的概念理解的不是很深入,这次对学习的内容做一个总结以免忘记。
说下自己的理解,文件的概念是一个有序的字节集合,而这个集合是可读(Read)和可写入(Write)的,同样也应该有一个文件的指针(Seek),文件的处理在.net 中被封闭成一个System.IO.Stream这个基类里面,所以这个基类里面一定有Read,Write,Seek这三个方法,这个类里面同时有很多的派生类,每一个派生类都有自己的Read,Write,Seek方法,这便构成了FileStream, NetworkStream, MemoryStream等派生类。
下面是Stream类的部分源码public abstract long Seek(long offset, SeekOrigin origin);public abstract int Read([In, Out] byte[] buffer, int offset, int count);public abstract void Write(byte[] buffer, int offset, int count);
下面是我写一个测试的代码,是根据byte对FileStream 转成MemoryStream,再根据MemoryStream转成FileStream代码如下,虽然有点繁琐,但我个人觉得还是能把问题说清的
//创建一个文件并写入数据 FileStream fileStream = new FileStream("Mytest.txt", FileMode.Create); string text = "我是刚刚被创建的文件!"; byte[] b = Encoding.UTF8.GetBytes(text);//设定对应的编码格式去读取文本 fileStream.Write(b, 0, b.Length);//把二进制写入当前的文件流对象 fileStream.Close();//关闭 //读取这个文件转成内存流,并再次写入文件 FileStream mFileStream = new FileStream("Mytest.txt", FileMode.Open);//打开 byte[] mbyte = new byte[mFileStream.Length]; mFileStream.Read(mbyte, 0, mbyte.Length);//读取文件到字节数据 fileStream.Close(); MemoryStream ms = new MemoryStream(mbyte);//创建内存流的对象 /******************************** *方法一,利用ms 转成字节数据来处理 * **/ //byte[] fbBytes = ms.ToArray(); /******************************** *方法二,利用ms 读取内存的数据来处理 *写入指定的字节数组 **/ byte[] fbBytes = new byte[mbyte.Length]; ms.Read(fbBytes, 0, fbBytes.Length);//这个是用Read方法,而不是write 写法,因为是在内存中读取数据 FileStream nFileStream = new FileStream("Mytest1.txt", FileMode.Create); nFileStream.Write(fbBytes, 0, fbBytes.Length); nFileStream.Close();
运行结果会在根目录生成两个文本文件其它的转换方法:
1.字符串=>比特数组
(1)byte[] bt=System.Text.Encoding.Default.GetBytes("字符串");
(2)byte[] bt=Convert.FromBase64String("字符串");
补充:
System.Text.Encoding.Unicode.GetBytes(str);
System.Text.Encoding.UTF8.GetBytes(str);
System.Text.Encoding.GetEncoding("gb2312").GetBytes(str); //指定编码方式
string str = "中国?ss123?";
byte[] bytes = System.Text.Encoding.Default.GetBytes(str); //gb2312编码汉字占2个字节、英文字母占1个字节 bytes长度为12
string s = System.Text.Encoding.Default.GetString(new byte[] { bytes[0],bytes[1] });//解码后为“中”
byte[] bytes = {97, 98, 99, 100, 101, 102};
string str = System.Text.Encoding.ASCII.GetString(bytes); //结果为:abcdef ASCII码表
常用方法:
GetString 已重载。 在派生类中重写时,将一个字节序列解码为一个字符串。
GetChars 已重载。 在派生类中重写时,将一个字节序列解码为一组字符。
GetBytes 已重载。 在派生类中重写时,将一组字符编码为一个字节序列。
GetByteCount 已重载。 在派生类中重写时,计算对一组字符进行编码所产生的字节数。
GetCharCount 已重载。 在派生类中被重写时,计算对字节序列进行解码所产生的字符数。
GetDecoder 在派生类中重写时,获取一个解码器,该解码器将已编码的字节序列转换为字符序列。
GetEncoder 在派生类中重写时,获取一个解码器,该解码器将Unicode字符序列转换为已编码的字节序列
2.比特数组 => 字符串
(1)string str=System.Text.Encoding.Default.GetString(bt);
(2)string str=Convert.ToBase64String(bt);
3.字符串 => 流
(1)MemoryStream ms=new MemoryStream(System.Text.Encoding.Default.GetBytes("字符串"));
(2)MemoryStream ms=new MemoryStream(Convert.FromBase64String("字符串"));
4.流 => 字符串
(1)string str=Convert.ToBase64String(ms.ToArray());
(2)string str=System.Text.Encoding.Default.GetString(ms.ToArray());
5.比特数组 => 流
(1)MemoryStream ms=new MemoryStream(bt);
(2)MemoryStream ms=new MemoryStream();ms.Read(bt,0,bt.Lenght);
6.流 => 比特数组
(1)byte[] bt=ms.ToArray();
(2)MemoryStream ms=new MemoryStream();
ms.Write(bt,0,ms.Length);
- 第15篇 文件流和内存流的学习总结
- 文件和流学习总结1
- PE文件到内存的映射学习总结
- 第12章Java流与文件操作的总结
- 0719学习总结(文件流的输入输出)
- Kconfig和Makefile文件的学习总结
- jvm关于内存管理和垃圾回收的学习总结
- QT总结第4篇:.lib和.dll文件的区别
- C#内存映射文件学习总结
- 文件读写流学习总结
- 内存泄漏和内存溢出的总结
- C++ Primer学习总结 第12章 动态内存
- 学习总结--内存泄露和垃圾回收
- C++ 学习笔记(五):高级编程:文件和流,异常处理,动态内存,命名空间
- C++学习笔记:高级编程:文件和流,异常处理,动态内存,命名空间
- 【Opencv学习(二)】内存溢出和内存泄漏总结
- JavaWeb学习总结——文件的上传和下载
- DOM4J 学习总结之 修改节点信息 将内存的DOM输出到xml文件
- Oracle ubuntu 下快速安装
- SVN中trunk,branches,tags用法详解
- Android常用Adapter代码例子
- 自动化部署工具pssh入门教程
- Python 学习LINK
- 第15篇 文件流和内存流的学习总结
- [MFC] CDialog::DoModal()函数用法
- jsp include指令
- Android 指纹扫描动画实现,仿新版360手机助手欢迎页
- 深入理解C#:查询集合
- 第16篇 基于Bootstarp 仿京东多条件筛选插件的开发(展示上)
- android开发笔记:listview
- 类指针的定义问题
- python之最简http文件列表显示服务