• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >ASP.NET > 用.NET 2.0压缩/解压功能处理大型数据

用.NET 2.0压缩/解压功能处理大型数据

作者: 字体:[增加 减小] 来源:互联网 时间:2017-05-11

通过本文主要向大家介绍了.net邮箱注册激活功能,net功能,net framework功能,无法安装以下功能 net,windows功能net等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

摘要 如果你的应用程序从未使用过压缩,那么你很幸运。而对于另一部分使用压缩的开发人员来说,好消息是,.NET 2.0如今提供了两个类来处理压缩和解压问题。本文正是想讨论何时以及如何使用这些有用的工具。

引言

.NET框架2.0中的一个新名称空间是System.IO.Compression。这个新名称空间提供了两个数据压缩类:DeflateStream和GZipStream。这两个压缩类都支持无损压缩和解压,其设计目的是为了处理流式数据的压缩和解压问题。

压缩是减少数据大小的有效办法。例如,如果你有巨大量的数据存储在你的SQL数据库中,那么如果你在把这些数据保存到一个表之前压缩一下,你就可以节省大量的磁盘空间。而且,既然现在你把更小块的数据保存到你的数据库中,花费在磁盘I/O方面的操作将会大大减少。压缩的缺点是,它要求你的机器进行另外的处理(因此需要另外的处理时间),并且,在你决定把压缩应用于你的程序之前,你需要计算这一部分时间。

压缩在你需要在网上传送数据的情况中是极其有用的,特别是对于非常慢且代价昂贵的网络,例如GPRS连接。在这种情况中,使用压缩能够极大地缩小数据尺寸并且减少整个通讯耗费。Web服务是另一个领域-此时,使用压缩能提供巨大的优点,因为XML数据能被高度压缩。

但是一旦你认为程序的性能代价值得使用压缩,那么你将需要深入地理解.NET 2.0的两个新的压缩类,而这正是我想在本文中所阐述的。

创建示例应用程序

在本文中,我将构建一个示例应用程序来展示压缩的使用。该应用程序允许你压缩文件,包括普通文本文件。然后,你能够把该示例中的代码重用于你自己的应用程序中。

首先,使用Visual Studio 2005创建一个新的Windows应用程序并且使用下列控件来填充默认的表单(见图1):

按此在新窗口浏览图片

图1.填充表单:使用所有显示的控件填充默认的Form1。

· GroupBox控件

· RadioButton控件

· TextBox控件

· Button控件

· Label控件

切换到Form1的code-behind并且导入下列名称空间:

Imports System.IO

Imports System.IO.Compression

在你开始使用压缩类前,理解其工作原理是非常重要的。这些压缩类从一个字节数组中读取数据,压缩它并且把结果存储到一个流对象中。对于解压来说,解压存储到一个流对象中的数据,然后把它存储到另一个流对象中。

首先,定义Compress()函数,它有两个参数:algo和data。第一个参数指定使用哪种算法(GZip或Deflate);第二个参数是一个包含要压缩的数据的字节数组。一个内存流对象将被用来存储压缩数据。一旦压缩完成,你需要计算压缩比,这是用压缩的数据的大小除以解压数据的大小计算的。

然后,存储在内存流中的压缩的数据被复制到另一个字节数组中并且被返回到调用函数。另外,你还要使用一个StopWatch对象来跟踪该压缩算法使用了多少时间。Compress()函数定义如下:

Public Function Compress(ByVal algo As String, ByVal data() As Byte) As Byte()

Try

Dim sw As New Stopwatch

'---ms用于存储压缩的数据---

Dim ms As New MemoryStream()

Dim zipStream As Stream = Nothing

'---开始秒表计时---

sw.Start()

If algo = "Gzip" Then

zipStream = New GZipStream(ms, CompressionMode.Compress, True)

ElseIf algo = "Deflate" Then

zipStream = New DeflateStream(ms, CompressionMode.Compress, True)

End If

'---使用存储在数据中的信息进行压缩---

zipStream.Write(data, 0, data.Length)

zipStream.Close()

'---停止秒表---

sw.Stop()

'---计算压缩比---

Dim ratio As Single = Math.Round((ms.Length / data.Length) * 100, 2)

Dim msg As String = "Original size: " & data.Length & _

", Compressed size: " & ms.Length & _

", 压缩比: " & ratio & "%" & _

", Time spent: " & sw.ElapsedMilliseconds & "ms"

lblMessage.Text = msg

ms.Position = 0

'---用来存储压缩了的数据(字节数组)---

Dim c_data(ms.Length - 1) As Byte

'---把内存流的内容读取到字节数组---

ms.Read(c_data, 0, ms.Length)

Return c_data

Catch ex As Exception

MsgBox(ex.ToString)

Return Nothing

End Try

End Function

这个Decompress()函数将解压由Compress()函数压缩的数据。第一个参数指定要使用的算法。包含压缩的数据的字节数组被作为第二个参数传递,然后它被复制到一个内存流对象中。然后,这些压缩类将解压存储在内存流中的数据,然后把解压的数据存储到另一个流对象中。为了获得解压的数据,你需要读取来自流对象的数据。这是通过使用RetrieveBytesFromStream()函数来实现的(将在后面解释)。

Decompress()函数的定义如下所示:

Public Function Decompress(ByVal algo As String, ByVal data() As Byte) As Byte()

Try

Dim sw As New Stopwatch

'---复制数据(压缩的)到ms---

Dim ms As New MemoryStream(data)

Dim zipStream As Stream = Nothing

'---开始秒表---

sw.Start()

'---使用存储在ms中的数据解压---

If algo = "Gzip" Then

zipStream = New GZipStream(ms, CompressionMode.Decompress)

ElseIf algo = "Deflate" Then

zipStream = New DeflateStream(ms, CompressionMode.Decompress, True)

End If

'---用来存储解压的数据---

Dim dc_data() As Byte

'---解压的数据存储于zipStream中;

'把它们提取到一个字节数组中---

dc_data = RetrieveBytesFromStream(zipStream, data.Length)

'---停止秒表---

sw.Stop()

lblMessage.Text = "Decompression completed. Time spent: " & _

sw.ElapsedMilliseconds & "ms" & _

", Original size: " & dc_data.Length

Return dc_data

Catch ex As Exception

MsgBox(ex.ToString)

Return Nothing

End Try

End Function

这个RetrieveBytesFromStream()函数使用了两个参数:一个流对象,一个整数,并返回一个包含解压的数据的字节数组。这个整数参数用于决定每次把多少个字节从该流对象中读取到字节数组中。这是必要的,因为当数据被解压时

分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • .NET 常用功能和代码小结
  • 用.NET 2.0压缩/解压功能处理大型数据

相关文章

  • 2017-05-11IE和火狐中模仿Click事件及提交到新窗口总结(asp.net)
  • 2017-05-11ASP.NET编程中的十大技巧第1/2页
  • 2017-05-11析构函数的作用 什么是析构函数
  • 2017-05-11asp.net 安全的截取指定长度的html或者ubb字符串
  • 2017-05-11ASP.NET中事件如何依次发生?
  • 2017-05-11ASP.NET笔记之页面跳转、调试、form表单、viewstate、cookie的使用说明
  • 2017-05-11Path类与Directory类与File类对路径/目录/文件的操作实例
  • 2017-05-11asp.net实现识别客户端浏览器或操作系统
  • 2017-05-11asp.net控件DataList分页用法
  • 2017-05-11asp.net Reporting Service在Web Application中的应用

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • 使用重绘项美化WinForm的控件
    • ASP.NET Session会导致的性能问题
    • asp.net中的cookie使用介绍
    • asp.net 独立Discuz头像编辑模块分离打包
    • asp.net CheckBoxList各项最小宽度CSS样式(兼容性good)
    • ASP.NET 输出图片简单代码
    • asp.net SAF 中缓存服务的实现第1/5页
    • ASP.NET中利用Segments取得URL的文件名的一种方法分享
    • jQuery实现倒计时跳转的例子
    • ASP.NET编程中经常用到的27个函数集

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有