压缩、解压缩流GZipStream
如果要在压缩过程中检查错误或要与其他操作系统所用程序共享压缩数据,则要是用GZipStream类。GZipStream类包含是用GZip数据格式进行压缩和解压缩文件的方法,该类不能用于解压缩大于4GB的文件。
一、属性
BaseStream 获取对基础流的引用。
CanRead 获取一个值,该值指示流是否支持在解压缩文件的过程中读取文件。 (重写 Stream..::.CanRead。)
CanSeek 获取一个值,该值指示流是否支持查找。 (重写 Stream..::.CanSeek。)
CanTimeout 获取一个值,该值确定当前流是否可以超时。 (继承自 Stream。)
CanWrite 获取一个值,该值指示流是否支持写入。 (重写 Stream..::.CanWrite。)
Length 不支持,并且总是引发 NotSupportedException。 (重写 Stream..::.Length。)
Position 不支持,并且总是引发 NotSupportedException。 (重写 Stream..::.Position。)
ReadTimeout 获取或设置一个值(以毫秒为单位),该值确定流在超时前尝试读取多长时间。 (继承自 Stream。)
WriteTimeout 获取或设置一个值(以毫秒为单位),该值确定流在超时前尝试写入多长时间。 (继承自 Stream。)
二、方法
BeginRead 开始异步读操作。 (重写 Stream..::.BeginRead(array<Byte>[]()[], Int32, Int32, AsyncCallback, Object)。)
BeginWrite 开始异步写操作。 (重写 Stream..::.BeginWrite(array<Byte>[]()[], Int32, Int32, AsyncCallback, Object)。)
Close 关闭当前流并释放与之关联的所有资源(如套接字和文件句柄)。 (继承自 Stream。)
CreateObjRef 创建一个对象,该对象包含生成用于与远程对象进行通信的代理所需的全部相关信息。 (继承自 MarshalByRefObject。)
Dispose 已重载。
EndRead 等待挂起的异步读取完成。 (重写 Stream..::.EndRead(IAsyncResult)。)
EndWrite 处理异步写入的结束。 (重写 Stream..::.EndWrite(IAsyncResult)。)
Flush 将当前 GZipStream 对象的内部缓冲区的内容刷新到基础流。 (重写 Stream..::.Flush()()()。)
GetHashCode 用作特定类型的哈希函数。 (继承自 Object。)
GetLifetimeService 检索控制此实例的生存期策略的当前生存期服务对象。 (继承自 MarshalByRefObject。)
InitializeLifetimeService 获取控制此实例的生存期策略的生存期服务对象。 (继承自 MarshalByRefObject。)
MemberwiseClone 已重载。
Read 将若干解压缩的字节读入指定的字节数组。 (重写 Stream..::.Read(array<Byte>[]()[], Int32, Int32)。)
ReadByte 从流中读取一个字节,并将流内的位置向前推进一个字节,或者如果已到达流的末尾,则返回 -1。 (继承自 Stream。)
Seek 此属性不受支持,并且总是引发 NotSupportedException。 (重写 Stream..::.Seek(Int64, SeekOrigin)。)
SetLength 此属性不受支持,并且总是引发 NotSupportedException。 (重写 Stream..::.SetLength(Int64)。)
Write 从指定的字节数组中将压缩的字节写入基础流。 (重写 Stream..::.Write(array<Byte>[]()[], Int32, Int32)。)
WriteByte 将一个字节写入流内的当前位置,并将流内的位置向前推进一个字节。 (继承自 Stream。)
练了下手,附上代码:(注意释放资源。)

static void Main(string[] args)
{
//string str = "你好asd阿叔打算";
//for (int i = 0; i < 20000; i++)
//{
// str += "你好asd阿叔打算的";
//}
//File.WriteAllText(@"E:\file.txt", str, Encoding.UTF8);
//Console.WriteLine("添加完成");
//以上代码输出一个468K的txt文件 FileStream fs = new FileStream(@"E:\file.txt", FileMode.Open, FileAccess.ReadWrite);
byte[] bytes = new byte[fs.Length];
fs.Read(bytes,0,(int)fs.Length); // 压缩入这个文件流
FileStream fs1 = new FileStream(@"E:\file1.txt", FileMode.CreateNew, FileAccess.Write);
GZipStream gs = new GZipStream(fs1, CompressionMode.Compress, true);
//把数据写入压缩流
gs.Write(bytes, 0, bytes.Length); //写入之后,会自动调用FileStream.Write()方法 这时候E盘会生成一个E:\file1.txt文件,里面是压缩之后的内容
Console.WriteLine(fs.Length); //输出 480024
Console.WriteLine(fs1.Length); //输出 5142 //压缩流写入内存
MemoryStream target = new MemoryStream();
GZipStream gzs = new GZipStream(target, CompressionMode.Compress, true);
gzs.Write(bytes, 0, bytes.Length); //相当于调用了MemoryStream的Write方法,已将压缩的数据写入内存
byte[] byteCompress = target.ToArray();
Console.WriteLine(target.Length); //输出5142 //解压缩后输出
FileStream fs2 = new FileStream(@"E:\file1.txt",FileMode.Open,FileAccess.Read);
byte[] byte1 = new byte[fs2.Length];
GZipStream gzs1 = new GZipStream(fs2, CompressionMode.Decompress, true);
StreamReader streamR = new StreamReader(gzs1, Encoding.Default);
string str = streamR.ReadToEnd();
Console.WriteLine(str); //输出解压之后的内容了 好长的 //解压缩之后用Read()是在不知道长度该如何确定
FileStream fs3 = new FileStream(@"E:\file1.txt", FileMode.Open, FileAccess.Read);
byte[] byte2 = new byte[fs2.Length];
GZipStream gzs2 = new GZipStream(fs2, CompressionMode.Decompress, true);
gzs1.Read(byte2,0,byte2.Length);
Console.WriteLine(Encoding.UTF8.GetString(byte2)); //输出解压之后的内容了 好长的 Console.ReadKey();
}

压缩、解压缩流GZipStream的更多相关文章
- [转][C#]压缩解压缩类 GZipStream
本文来自:https://msdn.microsoft.com/zh-cn/library/system.io.compression.gzipstream(v=vs.100).aspx using ...
- .net学习之集合、foreach原理、Hashtable、Path类、File类、Directory类、文件流FileStream类、压缩流GZipStream、拷贝大文件、序列化和反序列化
1.集合(1)ArrayList内部存储数据的是一个object数组,创建这个类的对象的时候,这个对象里的数组的长度为0(2)调用Add方法加元素的时候,如果第一次增加元神,就会将数组的长度变为4往里 ...
- Java基础-IO流对象之压缩流(ZipOutputStream)与解压缩流(ZipInputStream)
Java基础-IO流对象之压缩流(ZipOutputStream)与解压缩流(ZipInputStream) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 之前我已经分享过很多的J ...
- Hadoop案例(二)压缩解压缩
压缩/解压缩案例 一. 对数据流的压缩和解压缩 CompressionCodec有两个方法可以用于轻松地压缩或解压缩数据.要想对正在被写入一个输出流的数据进行压缩,我们可以使用createOutput ...
- Linux下的压缩解压缩命令详解
linux zip命令zip -r myfile.zip ./*将当前目录下的所有文件和文件夹全部压缩成myfile.zip文件,-r表示递归压缩子目录下所有文件. 2.unzipunzip -o - ...
- Qt之QuaZIP(zip压缩/解压缩)
简述 QuaZIP是使用Qt/C++对ZLIB进行简单封装的用于压缩及解压缩ZIP的开源库.适用于多种平台,利用它可以很方便的将单个或多个文件打包为zip文件,且打包后的zip文件可以通过其它工具打开 ...
- hadoop的压缩解压缩,reduce端join,map端join
hadoop的压缩解压缩 hadoop对于常见的几种压缩算法对于我们的mapreduce都是内置支持,不需要我们关心.经过map之后,数据会产生输出经过shuffle,这个时候的shuffle过程特别 ...
- Linux/centos/redhat下各种压缩解压缩方式详解
1.zip命令 zip -r myfile.zip ./* 将当前目录下的所有文件和文件夹全部压缩成myfile.zip文件,-r表示递归压缩子目录下所有文件. 2.unzip unzip -o -d ...
- ICSharpCode.SharpZipLib实现压缩解压缩
最近,在项目中经常需要处理压缩和解压缩文件的操作.经过查找,发现了ICSharpCode.SharpZipLib.dll ,这是一个完全由c#编写的Zip, GZip.Tar . BZip2 类库,可 ...
随机推荐
- android AndroidManifest.xml 多个android.intent.action.MAIN (
可以的 ,一个程序是可以有多个入口的.如果你设置两个,并且category都是android.intent.category.LAUNCHER,那么你就 会发现你的手机中就会出现两个快捷方式,也就是两 ...
- 5.1.1 读取Redis 数据
Redis 服务器是Logstash 推荐的Broker选择,Broker 角色就意味会同时存在输入和输出两个插件. 5.1.1 读取Redis 数据 LogStash::Input::Redis 支 ...
- bzoj1615 [Usaco2008 Mar]The Loathesome Hay Baler麻烦的干草打包机
Description Farmer John新买的干草打包机的内部结构大概算世界上最混乱的了,它不象普通的机器一样有明确的内部传动装置,而是,N (2 <= N <= 1050)个齿轮互 ...
- bzoj1755 [Usaco2005 qua]Bank Interest
Description Farmer John made a profit last year! He would like to invest it well but wonders how muc ...
- UVA12186--树型DP
树型DP第一题...就是从boss到底层员工是一个树型结构,底层员工想加薪,如果每个boss都有超过T%的员工要求加薪,他就会往更高的bOSs传达,问如果让根节点的大boss接到加薪要求,最少要有多少 ...
- ofbiz ins
- (转载)关于#pragma pack(push,1)和#pragma pack(1)
转载http://www.rosoo.net/a/201203/15889.html 一.#pragma pack(push,1)与#pragma pack(1)的区别 这是给编译器用的参数设置,有关 ...
- [Linux] killall 、kill 、pkill 命令详解
killall 命令 Linux系统中的killall命令用于杀死指定名字的进程(kill processes by name).我们可以使用kill命令杀死指定进程PID的进程,如果要找到我们需要杀 ...
- ubuntu 14.04 下试用Sublime Text 3
很多源代码都没有IDE支持的,尤其是开源的源代码.从github上下载的,很多也不用IDE.包括我自己公司的代码,基本都是脚本,也不用IDE.通常情况下,都是用notepad++.UE之类的文本编辑器 ...
- WPF页面切换及弹窗
WPF页面切换及弹窗 结构如图: 效果如图: 代码如下: xaml <Window x:Class="PageChange.MainWindow" xmlns="h ...