IO异步,读写压缩文件,监控文件系统
这节结尾IO,讲一下异步操作文件,读写压缩文件,监控文件系统这三个知识点。
异步操作文件:
说到异步,必然要了解的是async和await这两个关键字(异步详情点击基于任务的异步编程(Task,async,await)这篇文章进行了解),此段讲解对于初学者可以简单涉猎,接下来进入正题,在操作大文件的时候,必然要消耗大量的时间,同步情况下,必然会阻塞程序执行,所以.NET 4.5以后,对FileStream和StreamReader/Writer的读写文件方法加入了异步版本,从而在操作大文件时解放对主线程的阻塞,我们可以通过Async后缀来区分哪是异步的,如FileStream的ReadAsync()是Read()的异步版本。
使用异步,需要将异步的逻辑封装到一个方法中,下面演示代码,代码逻辑跟FileStream的演示代码一样:
private async static Task<string> ReadFile(FileStream fs)
{
int len, i = 0;
byte[] buffer = new byte[5];
byte[] data = new byte[fs.Length];
while ((len =await fs.ReadAsync(buffer, 0, buffer.Length)) != 0)
{
for (int j = 0; j < len; j++)
{
data[i++] = buffer[j];
}
}
return Encoding.UTF8.GetString(data);
}
接下来在主方法中调用:
FileStream fs = new FileStream("./demo.txt", FileMode.Open, FileAccess.Read);
Task<string> file = ReadFile(fs);
file.ContinueWith(t =>
{
Console.WriteLine(t.Result);
});
运行结果就是整个文件的所有文本。其它的异步方法我就不一一演示了。
读写压缩文件:
我们都用过压缩软件压缩文件,压缩文件的原理大体上可以理解为通过算法把重复的数据清除,解压缩就是通过算法把清除的重复数据复原。.NET给我们提供了两个用于压缩的类:GZipStream和DeflateStream,它们存在于System.IO.Compression这个命名空间下,这两个类用法都差不多,而且都是公开免费的,下面简单通过代码介绍一下如何压缩一个文件,至于更高级的一次压缩多个文件,读者可以自行查阅相关文档。
//目标文件
StreamReader sr=new StreamReader("./demo.txt");
//压缩后文件
FileStream fw=new FileStream("./demo_zip.txt.zip",FileMode.OpenOrCreate,FileAccess.Write); //基于FileStream创建压缩对象
GZipStream gs=new GZipStream(fw,CompressionMode.Compress);
//写入压缩后的数据
StreamWriter sw=new StreamWriter(gs);
string data=string.Empty;
while ((data=sr.ReadLine())!=null)
{
sw.Write(data);
}
//必须关闭写入对象,否则会导致压缩文件失败
sw.Close();
运行完成后,可以看一下两个文件的大小:

在创建压缩对象的时候,第二个参数是CompressionMode枚举,它有两个成员:Compress和Decompress,指定是压缩还是解压缩,解压缩的方式跟压缩一样,此处不再赘述。
监控文件系统:
.NET 提供了一个FilSystemWatcher类用于监控文件系统,何为监控文件系统呢,就是监控文件或者目录的操作,当用户进行某项操作时,监控对象会调用对应的方法,这跟事件及其响应机制是一样的模式。
本节对此不做代码演示,主要讲解一下FileSystemWatcher类的一些属性:
Path:设置要监控的文件位置或者目录
NotifyFilter:枚举,指示要监控的内容,可以通过OR运算符进行枚举合并
Filter:指定要监控哪些文件:如*.txt
FilSystemWatcher类有四个事件:Changed,Created,Deleted,Renamed,我们需要为这四个事件添加事件处理程序,当监控到特定行为时,就会触发相应的事件。
这是我的公众号二维码,获取最新文章,请关注此号

IO异步,读写压缩文件,监控文件系统的更多相关文章
- python 读写压缩文件
gzip 和bz2 模块可以很容易的处理这些文件.两个模块都为open() 函数提供了另外的实现来解决这个问题.比如,为了以文本形式读取压缩文件,可以这样做: # gzip compression i ...
- C#之读写压缩文件
在处理文件时,常常会发现文件中有许多空格,耗尽了硬盘空间,.net的类提供了GZIP/Deflate算法可以压缩文件.这里只介绍了文件的压缩,但在实际应用更多的是压缩文件夹 压缩文件 解压文件 可以使 ...
- 利用System.IO.Compression操作压缩文件
引用: using System.IO.Compression; using (FileStream zipToOpen = new FileStream(@"D:\json.zip&quo ...
- 【Go】使用压缩文件优化io (一)
原文连接:https://blog.thinkeridea.com/201906/go/compress_file_io_optimization1.html 最近遇到一个日志备份 io 过高的问题, ...
- IO操作之使用zip包压缩和解压缩文件
转自:http://www.cdtarena.com/java.htmlJava API中的import java.util.zip.*;包下包含了Java对于压缩文件的所有相关操作. 我们可以使 ...
- 别人的Linux私房菜(9)文件与文件系统的压缩
www网站利用文件压缩技术进行数据传输,提升网络带宽. 压缩命令gzip与显示zcat.zmore.zless.zgrep -c将压缩的数据显示到屏幕上 -d解压缩 -v显示原文件/压缩文件的压缩比等 ...
- Linux学习笔记—文件与文件系统的压缩与打包(转载)
压缩文件的用途与技术 例如,计算机都是以byte单位来计量的,1byte占8bit.如果存储数字1,那么1byte就会空出7bit.采用一定的计算方式,压缩这些空间可以大大降低文件存储. Linux系 ...
- 【Go】使用压缩文件优化io (二)
原文链接: https://blog.thinkeridea.com/201907/go/compress_file_io_optimization2.html 上一篇文章<使用压缩文件优化io ...
- Linux学习笔记之文件与文件系统的压缩与打包
四.文件与文件系统的压缩与打包 用途: 传输时减少带宽 Linux系统常见的压缩命令 Compass(旧版压缩,并且在centOS中默认为不安装) gzip, zcat bzip2, bzcat zi ...
随机推荐
- Vue 全家桶学习资源(转)
companion: React 全家桶学习资源(持续更新) 下面整理了一些关于Vue以及Vue衍生的学习资源: 官网文档 官网API ECMAScript 6 入门 30分钟掌握ES6/ES2015 ...
- 060_Cookie/Session
目录 会话 有状态会话 保存会话的两种技术 cookie session 常见场景 Cookie cookie细节 删除cookie Session 什么是session session使用场景 se ...
- JetBrains Projector 体验
先来一张最终效果图: JetBrains Projector 是 JetBrains 的"远程开发"解决方案,基于 Client + Server 架构,对标的是微软 VSCode ...
- DAOS 分布式异步对象存储|相关组件
DAOS 的安装涉及多个组件,这些组件可以是集中式的,也可以是分布式的. DAOS 软件定义存储 (software-defined storage, SDS) 框架依赖于两种不同的通信通道: 用于带 ...
- A. 【例题1】数字反转
题目解析 字符串的基础操作,注意判断零即可 #include <bits/stdc++.h> using namespace std; int i; char c[15]; int mai ...
- day-05-字典
字典的初识 why: 列表可以存储大量的数据,但数据之间的关联性不强 列表的查询速度比较慢.数量越大查询越慢 what:容器型数据类型:dict how: 数据类型的分类(可变与不可变) 可变(不可哈 ...
- kestrel Server的源码分析
今天这一篇博客讲的是.net core 自带的kestrel server,当你开发微服务k8s部署在linux环境下,一般默认开启这个高性能服务,如果大家之前看过我的owin katana的博客,会 ...
- IDEA/JRebel实现内部/外部/远程Tomcat热部署Spring Boot
1 概述 所谓热部署,对于Java应用程序来说,就是在运行时更新Java类文件.IDEA可以使用自带的Spring Boot热部署的方式进行本地/远程热部署,或者使用JRebel进行本地/远程热部署, ...
- 简单的了解下Java设计模式:迭代器模式(转载)
迭代器模式定义 迭代器模式(Iterator),提供一种方法顺序访问一个聚合对象中的各种元素,而又不暴露该对象的内部表示. Java 开发过程中遍历是常用的.如下边程序: for(int i =0 ; ...
- JDBC_07_SQL注入问题 (登录和注册)
SQL注入问题 导致SQL注入的根本原因是什么? 用户输入的信息中含有sql语句的关键字,并且用户所输入的信息参与了sql语句的编译过程,导致sql语句的原意被扭曲. 模拟用户登陆注册,演示sql注入 ...