C#文件操作(二)

一、前言

文章的续作前文是:

C#文件操作(一)-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/qq_71897293/article/details/135117922?spm=1001.2014.3001.5501

二、流

        流是序列化设备的抽象表示序列化设备可以线性方式储存数据并可按照同样的方式访问一次访问一个字节此设备可以是磁盘文件网络通道内存位置或其他支持以现行方式读取的对象把设备变成抽象的就可以隐藏流的底层目标和元 (书上对于流的介绍)

1 FileStream 

        FileStream类提供了很多对文件读写的方法,需要注意FileStream是对字节和字节数组操作而StreamWriter和StreamRead则是对字符数据操作,这是二者不同的地方。主要是对文件的读写操作。

1.1读取文件

举个例子:

 //储存数据的字节数组byte[] bytes = new byte[1024];System.IO.FileStream fileStream = new System.IO.FileStream("Log.txt", System.IO.FileMode.OpenOrCreate);//将指针移到文件的开始位置的第七个字节处fileStream.Seek(0, System.IO.SeekOrigin.Begin);//读取方法 Read  参数第一个:读取到的数据写入的字节数组  第二个:在字节数组中的第几个字节处放置读取的数据 //第三个:指定读取的字节数//注意:如果要更改读取放置的位置那么字节长度也要相应减少 不然会报错fileStream.Read(bytes,10, bytes.Length-10);//将读取的字节数组通过 Encoding转码得到一个字符串 输出出来System.Console.WriteLine(System.Text.Encoding.UTF8.GetString(bytes));System.Console.ReadKey();

提示:1 FileStream有多个重载版本其中使用最多的是两个参数或三个参数的构造器。 

System.IO.FileStream fileStream2= new System.IO.FileStream
("Log.txt", System.IO.FileMode.OpenOrCreate,System.IO.FileAccess.Read);

注意:

        其中FileMode指定了如何打开或创建文件,FileAccess指定了流的作用 ,都是枚举类型,其中如果FileAccess 指定了流的作用是读取文件那么如果你实际是写入文件那么将会抛出异常。

1.2 写入文件

 举个例子:

  try{//将要写入的信息转换为字节数组byte[] bytes = System.Text.Encoding.UTF8.GetBytes("写入文件的信息");//指定对文件进行OpenOrCreate 操作 流是进行写入操作System.IO.FileStream fileStream = new System.IO.FileStream("Log.txt", System.IO.FileMode.OpenOrCreate, System.IO.FileAccess.Write);//将指针移动指文件结束位置 的第0个位置写入fileStream.Seek(0, System.IO.SeekOrigin.End);//写入fileStream.Write(bytes, 0, bytes.Length);}catch (System.Exception ex){System.Console.WriteLine(ex.Message);System.Console.ReadKey();}

注意:

        文件类似的操作是很容易由各种原因引发异常,我们在对文件操作时应当使用Try语句。对异常进行处理和预防。 

2 StreamWriter

        StreamWriter前面提到了是对字符数据进行操作。如果不需要将指针指向文件何处位置那么使用此类是很简单的。

2.1 创建StreamWriter 对象

第一种:

 FileStream fileStream = new FileStream("Log.txt", FileMode.Open, FileAccess.Read);StreamWriter writer = new StreamWriter(fileStream);

提示:可以在已经有了FileStream对象时可以这么创建 

第二种:

StreamWriter writer = new StreamWriter("Log.txt",false);

示例解释:

        两个参数,第二个参数是设置是否对文件进行追加,True则是在文件结束处追加在后面,False则是重头写入,或者新建一个文件写入。 

2.2 写入文件

举个例子:

 System.IO.FileStream fileStream = new System.IO.FileStream("Log.txt", FileMode.OpenOrCreate);System.IO.StreamWriter writer = new System.IO.StreamWriter(fileStream);writer.WriteLine("信息1");writer.Write("信息2");writer.Write("信息3");writer.Write("信息4");writer.Write("信息5");writer.Close();

效果:

3 StreamRead

        StreamRead前面也提到了也是对字符数据进行操作。它一样有两种创建的方式和StreamWriter类似。

3.1 读取文件

举个例子:

   System.IO.FileStream fileStream = new System.IO.FileStream("Log.txt", System.IO.FileMode.OpenOrCreate);System.IO.StreamReader writer = new System.IO.StreamReader(fileStream);int charcode=default;while (charcode!=-1){Console.Write(Convert.ToChar(charcode));charcode = writer.Read();}writer.Close();//还有读取方法writer.ReadLine(); 与 writer.ReadToEnd();Console.ReadKey();

 提示:除了当前使用的方法还有ReadLine 和ReadToEnd方法。效果与直译效果一样。

4 异步文件访问

         当我们读取较大的文件时我们需要花费一点时间但我们不能让我们的主线程卡在读取从而无法正常与用户交互。其中我们上面使用的方法带有Async修饰的即代表异步读取,不会堵住我们的线程。

5 读写压缩文件

两个压缩流类举个例子:

封装的保存方法

 static void SaveCompressedFile(string filename, string data){FileStream fileStream =new FileStream(filename, FileMode.Create, FileAccess.Write);GZipStream compressionStream =  new GZipStream(fileStream, CompressionMode.Compress);StreamWriter writer = new StreamWriter(compressionStream);writer.Write(data);writer.Close();}

封装的读取方法

 static string LoadCompressedFile(string filename){FileStream fileStream =new FileStream(filename, FileMode.Open, FileAccess.Read);GZipStream compressionStream =new GZipStream(fileStream, CompressionMode.Decompress);StreamReader reader = new StreamReader(compressionStream);string data = reader.ReadToEnd();reader.Close();return data;}

使用方式:

  static void Main(string[] args){SaveCompressedFile("log.txt", "写入的数据");var str = LoadCompressedFile("log.txt");Console.WriteLine(str);Console.ReadKey();}

        需要注意当前的保存文件是对数据进行了压缩不是改为压缩包。书上提到的压缩比例是80:1。我们只需要了解如何使用就可以了

三、监控文件

        FileSystemWatcher类有一个公共无参的构造函数创建该对象实例后可以通过属性 EnableRaisingEvents为true的时候则代表开始监控 Path属性代表监控文件的路径 Filter代表监控哪种文件格式 *.*代表所有文件。NotifyFilter属性代表要监控的类型 我们可以使用二元OR运算符 来合并这些枚举值。

举个例子:

 watcher.NotifyFilter = NotifyFilters.LastWrite |NotifyFilters.FileName | NotifyFilters.Size;

注意: watcher 是FileSystemWatcher的实例

可以给当前类型创建多个处理事件。

 watcher.Deleted += (s, e) => { };watcher.Renamed += (s, e) =>{ };watcher.Changed += (s, e) => { };watcher.Created += (s, e) => { };

示例解释:分别创建了删除触发的世界更改触发的事件新建触发的事件重命名触发的事件  

本章学习完结 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/293387.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[微服务 ]微服务集成中的3个常见缺陷,以及如何避免它们

微服务风靡一时。他们有一个有趣的价值主张,即在与多个软件开发团队共同开发的同时,将软件快速推向市场。因此,微服务是在扩展您的开发力量的同时保持高敏捷性和快速的开发速度。 简而言之,您将系统分解为微服务。分解并不是什么新…

08、基于LunarLander登陆器的DDQN强化学习(含PYTHON工程)

08、基于LunarLander登陆器的DDQN强化学习(含PYTHON工程) LunarLander复现: 07、基于LunarLander登陆器的DQN强化学习案例(含PYTHON工程) 08、基于LunarLander登陆器的DDQN强化学习(含PYTHON工程&#xf…

网络故障?只需使用这个ChatGPT插件,解决率高达90%

1. 在使用 ChatGPT 时遇到的一些问题 近期,ChatGPT 受到了极大的关注,众多用户纷至沓来。仅用五天,ChatGPT 的用户数量就突破了 1 亿。下图展示了国外 TRT World 媒体统计的各大平台突破 1 亿用户的对比图。 如此迅速的用户增长也带来了一些…

超级逼真人脸生成,Stable Diffusion的3个关键技巧

大家好,你是否曾想过,为什么别人可以使用AI图像生成技术生成如此逼真的人脸,而自己的尝试却充满了错误和瑕疵,让人一眼看出是假的。尝试过调整提示和设置,但似乎仍无法与他人的质量相匹配。 本文将带大家了解使用Stab…

WPF组合控件TreeView+DataGrid之DataGrid封装

(关注博主后,在“粉丝专栏”,可免费阅读此文) wpf的功能非常强大,很多控件都是原生的,但是要使用TreeViewDataGrid的组合,就需要我们自己去封装实现。 我们需要的效果如图所示&#x…

Python---搭建Python自带静态Web服务器

1. 静态Web服务器是什么? 可以为发出请求的浏览器提供静态文档的程序。 平时我们浏览百度新闻数据的时候,每天的新闻数据都会发生变化,那访问的这个页面就是动态的,而我们开发的是静态的,页面的数据不会发生变化。 …

教你在Linux上安装Node并用Electron打包deb和rpm包

Windows下无法打linux版本的包,如果你要打linux系统的amd64架构需要找一台linux amd64的系统打包,也可以在amd64下打arm架构的包,但是不能运行,需要放到arm架构的系统里才能运行。 下载linux的node环境 Index of /nodejs-releas…

tomcat和nginx自定义404错误页面

nginx 编辑nginx配置文件 vim /www/server/nginx/nginx.conf server{listen 80;error_page 404 /404.html;location /404.html{root /home/liu/html/error-html;} }在家目录下创建一个html/error-html目录,用于存放错误页面 在error-html目录下创建404.html&a…

虾皮跨境电商的收款方式及选择指南

虾皮(Shopee)作为一家知名的跨境电商平台,为卖家提供了多种收款方式,以满足不同卖家的需求。本文将介绍虾皮跨境电商平台的主要收款方式,并提供选择指南,帮助卖家根据自身需求和目标市场选择最合适的收款方…

Python (十五)pandas(三)

程序员的公众号:源1024,获取更多资料,无加密无套路! 最近整理了一波电子书籍资料,包含《Effective Java中文版 第2版》《深入JAVA虚拟机》,《重构改善既有代码设计》,《MySQL高性能-第3版》&…

详解Java中的异常体系结构(throw,throws,try-catch,finally,自定义异常)

目录 一.异常的概念 二.异常的体系结构 三.异常的处理 异常处理思路 LBYL:Look Before You Leap EAFP: Its Easier to Ask Forgiveness than Permission 异常抛出throw 异常的捕获 提醒声明throws try-catch捕获处理 finally的作用 四.自定义异常类 一.异…

【Netty】编解码器

目录 Java的编解码Netty编解码器概念解码器(Decoder)编码器(Encoder)编码解码器Codec Java的编解码 编码(Encode)称为序列化, 它将对象序列化为字节数组,用于网络传输、数据持久化或者其它用途。 解码(Decode&#x…