.NET-11-文件流操作

所有的文件操作的父类都是Stream类

一般情况我们使用File,FileStream,StreamReader/StreamWrite,GZipStream来对文件进行操作

其中FileStream用来读取大的文件,高清电影等

File用来读取小的文本文件等

StreamReader/StreamWrite用来操作大的文本文件

GZipStream压缩流,实际是对流的进行操作进行压缩和解压

使用FileStream拷贝大文件

在进行大文件操作的时候,比如说高清电影等,需要进行循环读取与写入

每次读取一部分,然后把这部分写入到新的文件,然后继续从上次的文职继续读写

直到整个文件读写完成

FileStream创建方式
        //FileStream fs = File.Open();
        //FileStream fs1 = File.OpenRead();//返回只读的FileStream
        //FileStream fs2 = File.OpenWrite();//返回只写的FileStream
        //FileStream fs3 = new FileStream();

拷贝大文件的示例:

public static void GetCopy()
        {
            //需要拷贝的文件
            string pathFrom = @"C:\Users\Administrator\Desktop\test\练习用文件\1.avi";
            //拷贝到哪里
            string pathTo = @"C:\Users\Administrator\Desktop\test\练习用文件\2.avi";
            //用来存放读取的文件缓存
            byte[] beffer = new byte[1024 * 1024 * 3];

            //创建一个读的文件流
            using (FileStream fReader = new FileStream(pathFrom, FileMode.OpenOrCreate, FileAccess.Read))
            {
                //创建一个写的数据流
                using (FileStream fWrite = new FileStream(pathTo, FileMode.OpenOrCreate, FileAccess.Write))
                {
                    //开始第一次读取
                    int r = fReader.Read(beffer, 0, beffer.Length);
                    //如果读取到的字节数大于0,则说明还没有读完
                    while (r > 0)
                    {
                        //吧读取到的字节写入文件
                        fWrite.Write(beffer, 0, r);
                        //读取的进度
                        double d = (fReader.Position / (double)fReader.Length) * 100;
                        Console.WriteLine("{0:N2}", d);
                        //继续读取下一次
                        r = fReader.Read(beffer, 0, beffer.Length);
                    }
                }
            }
        }

使用File来操作小的文本文件

但是File在读取的时候会一次性吧整个文件全部读取到内存中去

如果文件比较大则会占用太大的内存空间,甚至导致内存的崩溃

File的这个特性限制了他只能操作小的文本文件,而不适合操作大的文本文件

File.ReadAllLines

FileStream虽然也能读取大的文本文件

但是如果在需要读取一部分就输出显示或者其他操作的时候

应为中文站连个字节,英文占一个字节,可能会导致中文被截断,这时候会导致编码解析错误

所以在对大的文本文件进行操作的时候,可以使用StreamReader和StreamWrite来进行读写

如下示例:

/// <summary>
        /// StreamReader用来读取大的文本文件
        /// 防止一次读取太大的文本文件导致内存报错
        /// </summary>
        public static void GetFile()
        {
            string path = @"C:\Users\Administrator\Desktop\test\1.txt";
            //StreamReader 逐行读取
            using (StreamReader sr = new StreamReader(path, Encoding.Default))
            {
                ////判断是否到了文档末尾,如果到了末尾则不再继续循环
                //while (!sr.EndOfStream)
                //{
                //    Console.WriteLine(sr.ReadLine());
                //}


                //判断读取的内容是不是为null,如果为null则不再继续循环
                string line = null;
                while ((line = sr.ReadLine()) != null)
                {
                    Console.WriteLine(line);
                }
            }


            string path2 = @"C:\Users\Administrator\Desktop\test\2.txt";
            using (StreamWriter sw = new StreamWriter(path2, true, Encoding.Default))
            {
                for (int i = 0; i < 100; i++)
                {
                    sw.WriteLine(i);
                }
            }
        }

GZipStream压缩流压缩和解压文本文件的示例:

/// <summary>
        /// 对文本文件进行压缩和解压缩
        /// </summary>
        public static void GetGZip()
        {
            //需要压缩的文本文件
            string fileNmae = @"C:\Users\Administrator\Desktop\test\练习用文件\1.txt";
            string zipName = @"C:\Users\Administrator\Desktop\test\练习用文件\11.txt";
            string fileName2 = @"C:\Users\Administrator\Desktop\test\练习用文件\111.txt";


            //压缩
            //创建读取文本文件的流
            using (FileStream fRead = new FileStream(fileNmae, FileMode.OpenOrCreate, FileAccess.Read))
            {
                //创建写入文件的流
                using (FileStream fWrite = new FileStream(zipName, FileMode.OpenOrCreate, FileAccess.Write))
                {
                    //根据写入流创建压缩流
                    using (GZipStream gzip = new GZipStream(fWrite, CompressionMode.Compress))
                    {
                        //存储读取的信息
                        byte[] beffer = new byte[1024 * 1];
                        //每次读取的实际长度
                        int len = 0;
                        //使用读取流来读取
                        while ((len = fRead.Read(beffer, 0, beffer.Length)) > 0)
                        {
                            //如果本次读取到了信息
                            //则通过压缩流写入文件
                            gzip.Write(beffer, 0, len);
                        }

                    }
                }
            }

            //解压缩
            //判断压缩文件是不是存在,如果存在解压缩
            if (File.Exists(zipName))
            {
                //创建读取文本文件的流
                using (FileStream fRead = new FileStream(zipName, FileMode.OpenOrCreate, FileAccess.Read))
                {
                    //创建写入文件的流
                    using (FileStream fWrite = new FileStream(fileName2, FileMode.OpenOrCreate, FileAccess.Write))
                    {
                        //根据读取流创建压缩流
                        using (GZipStream gzip = new GZipStream(fRead, CompressionMode.Decompress))
                        {
                            //存储读取的信息
                            byte[] beffer = new byte[1024 * 1];
                            //每次读取的实际长度
                            int len = 0;
                            //使用压缩流来读取
                            while ((len = gzip.Read(beffer, 0, beffer.Length)) > 0)
                            {
                                //如果本次读取到了信息
                                //则通过写入流写入文本文件
                                fWrite.Write(beffer, 0, len);
                            }

                        }
                    }
                }
            }
        }

猜你喜欢

转载自blog.csdn.net/m0_37532448/article/details/81155612