如果要在压缩过程中检查错误或要与其他操作系统所用程序共享压缩数据,则要是用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();
}