C#文件流FileStream的用法[通俗易懂]

C#文件流FileStream的用法[通俗易懂]1、简介FileStream类:主要用于对文件进行读取、写入、打开和关闭操作,并对其他与文件相关的操作系统句柄进行操作,如管道、标准输入和标准输出。读写操作可以指定为同步或异步操作。FileStream对输入输出进行缓冲,从而提高性能。——MSDN**简单点说:FileStream类可以对任意类型的文件进行读取操作,可根据需要来指定每次读取的字节长度(这是比File类优秀的地方之一),…

大家好,又见面了,我是你们的朋友全栈君。

1、简介

FileStream 类:主要用于对文件进行读取、写入、打开和关闭操作,并对其他与文件相关的操作系统句柄进行操作,如管道、标准输入和标准输出。读写操作可以指定为同步或异步操作。FileStream 对输入输出进行缓冲,从而提高性能。——MSDN

**简单点说:FileStream类可以对任意类型的文件进行读取操作,可根据需要来指定每次读取的字节长度(这是比File类优秀的地方之一),以此减少内存的消耗,提高读取效率。

2、File和FileStream的区别

    File是一个静态类;FileStream是一个非静态类。

       **最直接区别:将读取文件比作是从A桶往B桶运水。使用File就是整个用桶倒进去,使用FileStream就是使用水管慢慢输送,应用场景不同,大文件推荐FileStream,不会炸内存。

  File:是一个文件的类,对文件进行操作。其内部封装了对文件的各种操作(MSDN:提供用于创建、复制、删除、移动和打开单一文件的静态方法,并协助创建FileStream对象)。

       FileStream:是一个文件流的类,处理文件的原始字节,即处理byte[]。对txt,xml,avi等任何文件进行内容写入、读取、复制…

3、FileStream的用法示例

3.1 注意用using主动释放内存

using有两个主要用途:

1、作为指令,用于为命名空间创建别名或导入其他命名空间中定义的类型。

2、作为语句,用于定义一个范围,在此范围的末尾将释放对象,using的对象必须是实现IDisposable接口的。

这里用到了第二种,如果一个类实现了接口IDisposable(这个接口只有一个方法void Dispose()),当这个类在using中创建的时候,using代码块结束时会自动调用这个类中实现了接口IDisposable的Dispose()方法,也就是释放资源。一般来说,文件流都要主动释放资源的,因为读写文件是会加锁的,不释放的话,别的程序就无法使用文件了,这也就是FileStream一般和using配套使用的原因。当然,也可以不用using,但是在用完后需要显示调用三行代码:
                          fs.Flush();//清除缓冲区
                          fs.Close();//关闭
                          fs.Dispose();//释放

代码示例:

        static void Main(string[] args)
        {
            using (FileStream fs = new FileStream(@"C:\Users\awang\Desktop\1.txt", FileMode.OpenOrCreate, FileAccess.Read))
            {//在using中创建FileStream对象fs,然后执行大括号内的代码段,
             //执行完后,释放被using的对象fs(后台自动调用了Dispose)
                byte[] vs = new byte[1024];//数组大小根据自己喜欢设定,太高占内存,太低读取慢。
                while (true) //因为文件可能很大,而我们每次只读取一部分,因此需要读很多次
                {
                    int r = fs.Read(vs, 0, vs.Length); 
                    string s = Encoding.UTF8.GetString(vs, 0, r);
                    Console.WriteLine(s);
                    if (r == 0) //当读取不到,跳出循环
                    {
                        break;
                    }
                }
            }
            Console.ReadKey();
        }

3.2 读文件一般步骤
   

读文件即3.1中代码段,其中有以下重点:

1. FileStream fs = new FileStream(@”C:\Users\awang\Desktop\1.txt”, FileMode.OpenOrCreate, FileAccess.Read)

该构造函数有很多重载,上面用的是最最常用的一个。第一个参数填路径;第二个参数选择形式,选择openorcreate最保险,文件不存在就创建一个;第三个参数选read,即读取。

2. byte[] vs = new byte[1024]

新建缓存数组,数组大小根据自己喜欢设定(注意:太高占内存,太低读取慢。)

3. 循环读取数据,对应while循环代码(因为文件可能很大,而我们每次只读取一部分,因此需要读很多次,当读取完后,跳出循环)。
 

3.3 写文件一般步骤

        static void Main(string[] args)
        {
            string s = "写入文件写入文件写入文件写入文件写入文件写入文件";
            using (FileStream fs = new FileStream(@"C:\Users\awang\Desktop\1.txt", FileMode.OpenOrCreate, FileAccess.Write))
            {//在using中创建FileStream对象fs,然后执行大括号内的代码段,
             //执行完后,释放被using的对象fs(后台自动调用了dispose)
                byte[] buffer = Encoding.UTF8.GetBytes(s);      //把要写入的东西转换成byte数组
                fs.Write(buffer, 0, buffer.Length);          //写入
            }
            Console.ReadKey();
        }

其中有以下重点:

FileStream fs = new FileStream(@”C:\Users\awang\Desktop\1.txt”, FileMode.OpenOrCreate, FileAccess.Write)

第一个参数填路径;第二个参数选择形式,选择openorcreate最保险,文件不存在就创建一个;第三个参数选Write,即写入。

3.4 复制大文件一般步骤(读写同步)

        static void Main(string[] args)
        {
            string sourcePath = @"C:\Users\awang\Desktop\source.mp4";//需要被复制的文件的路径
            string targetPath = @"C:\Users\awang\Desktop\target.mp4";//复制到的路径
            using (FileStream fsRead = new FileStream(sourcePath, FileMode.OpenOrCreate, FileAccess.Read))
            {//创建读取文件的流
                using (FileStream fsWrite = new FileStream(targetPath, FileMode.OpenOrCreate, FileAccess.Write))
                {//创建写入文件的流
                    byte[] buffer = new byte[1024 * 1024 * 2];//缓存设置2MB;
                    while (true)//循环读取
                    {
                        int r = fsRead.Read(buffer, 0, buffer.Length);//读数据
                        if (r == 0)//读不到数据了,跳出循环
                        {
                            break;
                        }
                        fsWrite.Write(buffer, 0, r);//写数据
                    }
                }
            }
            Console.WriteLine("复制完成!");
            Console.ReadKey();
        }

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/162870.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • HTTP和HTTPS的区别,有什么优缺点「建议收藏」

    HTTP和HTTPS的区别,有什么优缺点「建议收藏」http和https:http就是超文本传输协议的缩写,用于从网站服务器传输数据到上网者的本地浏览器的协议https就是在http的基础加上了SSL或者其他的加密方式,所以这就是最主要的区别。原因:因为http在传输的时候是以明文的方式传输数据,这样的话在传输过程中如果被截获就能直接读取信息,所以并不安全,因此需要通过某种方式加密。怎样解决http不安全的问题呢?解决方法就是在http的基础上加上了SSL协议SSL,安全套接字协议,他是靠证书来验证服务端的身份,并在本地

    2022年8月31日
    6
  • 一条SQL语句实现数据库分页

    一条SQL语句实现数据库分页

    2021年4月26日
    148
  • GoDaddy免费空间详情

    GoDaddy免费空间详情导读:  在GoDaddy任意购买一个域名后就可以得到一个免费空间  空间大小是5G,流量限制是25G,文件大小不限,带广告(可去除),PHP或者ASP,数据库为MSSQL或者Access。  我现在用的GoDaddy免费空间是Linux(可选Windows),因为之前用的Windows因IP早已被封,所以将其删掉而重新选择了一个Linux。  免费空间换IP的方法只有一个:更换换主机类

    2022年7月11日
    24
  • 本体编辑、知识推理与检索

    本体编辑、知识推理与检索本体编辑、知识推理与检索一切要从一个倒霉项目开始说起,项目要求根据一个构建好的本体文件,通过JAVA调用相应API实现对本体文件的编辑、推理以及检索。由于之前对本体、知识图谱这些完全不熟悉,被强行推入坑之后就开始了漫长且毫无希望的技(疯)术(狂)调(百)研(度)之路。。。。调研之前:这是啥呀?调研之后:这tm都是些啥啊!!呼~~好在最后算是做出来了,故在此记录一下过程及部分主要代码。1…

    2022年5月16日
    54
  • 原型工具 墨刀_原型设计工具 axure

    原型工具 墨刀_原型设计工具 axure一、AxureAxureRP是美国AxureSoftwareSolution公司旗舰产品,是一个专业的快速原型设计工具,让负责定义需求和规格、设计功能和界面的专家能够快速创建应用软件或Web网

    2022年8月2日
    16
  • 《Java从小白到大牛》之第10章 面向对象基础(上)

    《Java从小白到大牛》之第10章 面向对象基础(上)

    2021年6月8日
    99

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号