第15篇 文件流和内存流的学习总结

原创 2015年11月18日 22:59:34
原来一起对文件流、内存流相关的概念理解的不是很深入,这次对学习的内容做一个总结以免忘记。
说下自己的理解,文件的概念是一个有序的字节集合,而这个集合是可读(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);

 

 
版权声明:本文为博主原创文章,未经博主允许不得转载。个人独立博客:http://blog.laofu.online/

java IO流学习总结

Java中的流,可以从不同的角度进行分类。     按流的方向分:输入流和输出流。     按处理数据单位分:字节流和字符流。     按实现功能分:节点流和处理流。       输出流:     ...
  • du_minchao
  • du_minchao
  • 2015年10月11日 12:35
  • 15345

Java中IO流学习总结

Java中IO流学习总结一.IO流中的结构 字符流:顾名思义,该流只能处理字符,但处理字符速度很快 字节流:可以处理所有以bit为单位储存的文件,也就是说可以处理所有的文件,但是在处理字符上的速度不如...
  • Yue_Chen
  • Yue_Chen
  • 2017年05月26日 18:00
  • 218

关于输入输出流的学习总结

个人的理解和总结: 首先要明确 输入输出 是对谁而言的?这里是相对程序而言的,什么是程序,就是你在编写的东西。 所以输入,就是程序从外部读取数据,用InputStream、Reader 里的read、...
  • lany1988
  • lany1988
  • 2016年11月18日 08:16
  • 430

Java I/O流系统学习心得

1.Java I/O系统概论 由于数据输入和接受端的多样性以及与他们通信方式的多样性(你可能需要按字节,按字符,顺序或随机地获得它们)存在,一个优秀的I/O系统对每门语言来说都是一个巨大挑战。Java...
  • linmoops
  • linmoops
  • 2016年07月29日 16:18
  • 357

Java IO流学习总结

Java流操作有关的类或接口: Java流类图结构:   流的概念和作用 流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象。即数据在两设备间的传输称为流,流的本质是数...
  • m631521383
  • m631521383
  • 2014年11月21日 16:57
  • 843

最完整的Java IO流学习总结

一、 File类 1、 java.io.File 类是专门对文件进行操作的类。(只能对文件本身进行操作,不能对文件内容操作) 2、 File类是“文件和目录路径名的抽象表示”。 而不是指文件的内容...
  • SilenceOO
  • SilenceOO
  • 2016年03月28日 00:37
  • 494

file(内存)----输入流---->【程序】----输出流---->file(内存)

当我们读写文本文件的时候,采用Reader是非常方便的,比如FileReader,InputStreamReader和BufferedReader。其中最重要的类是InputStreamReader,...
  • qq_29945661
  • qq_29945661
  • 2016年12月15日 11:43
  • 442

Java IO流学习总结一:输入输出流

Java IO流学习总结一:输入输出流 转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/53761199 本文出自【赵彦军的...
  • zhaoyanjun6
  • zhaoyanjun6
  • 2017年01月09日 19:49
  • 3312

java 内存流 利用内存流复制文件

package keTangTest; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.File...
  • weishimeng17
  • weishimeng17
  • 2017年04月19日 16:33
  • 590

java学习笔记之IO流总结(一)

输入输出作为所有程序都必需的部分   对于我们的java学习有特别重要的意义,以至于博主辛苦看了三天的流分布,跟大家分享一下 一.首先我们说一下io流的概念 流是一组有顺序的,有起点和终点的字节集...
  • qq_24235325
  • qq_24235325
  • 2016年10月14日 20:36
  • 1281
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:第15篇 文件流和内存流的学习总结
举报原因:
原因补充:

(最多只允许输入30个字)