第15篇 文件流和内存流的学习总结
2015-11-18 22:59
435 查看
原来一起对文件流、内存流相关的概念理解的不是很深入,这次对学习的内容做一个总结以免忘记。
说下自己的理解,文件的概念是一个有序的字节集合,而这个集合是可读(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);
相关文章推荐
- [MFC] CDialog::DoModal()函数用法
- 自动化部署工具pssh入门教程
- 深入理解C#:查询集合
- jsp include指令
- Python 学习LINK
- Android 指纹扫描动画实现,仿新版360手机助手欢迎页
- hadoop集群安装好之后的启动操作
- LeetCode OJ:Maximal Square(最大矩形)
- 快速排序算法(C#实现)
- SVN中trunk,branches,tags用法详解
- Oracle ubuntu 下快速安装
- 表
- 触摸事件类MotionEvent的一些小细节
- 第14篇 SQL游标、函数的使用方法
- Java记录 -82- 静态导入 Static Import
- JAVA注解
- 如果要25匹马中选出跑得最快的3匹,每次只有5匹马同时跑,最少要比赛几次?
- 实现ajax
- 使用hadoop命令警告提示:Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
- Coursera 台大 机器学习技法 第一讲 Linear Support Vector Machine