亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > .NET > 正文

用.NET 2.0壓縮/解壓功能處理大型數據

2020-01-18 01:54:06
字體:
來源:轉載
供稿:網友

摘要 如果你的應用程序從未使用過壓縮,那么你很幸運。而對于另一部分使用壓縮的開發人員來說,好消息是,.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()函數使用了兩個參數:一個流對象,一個整數,并返回一個包含解壓的數據的字節數組。這個整數參數用于決定每次把多少個字節從該流對象中讀取到字節數組中。這是必要的,因為當數據被解壓時,你不知道存在于流對象中的解壓數據的大小。因此,有必要動態地把字節數組擴展成塊以便存儲在運行時刻期間解壓縮的數據中。當你不斷地擴展字節數組時,塊太大會浪費內存,而塊太小則會失去珍貴的時間。因此,可以由調用例程來決定要讀取的最佳塊大小。

RetrieveBytesFromStream()函數的定義如下:

Public Function RetrieveBytesFromStream( _

ByVal stream As Stream, ByVal bytesblock As Integer) As Byte()

'---從一個流對象中檢索字節---

Dim data() As Byte

Dim totalCount As Integer = 0

Try

While True

'---逐漸地增加數據字節數組-的大小--

ReDim Preserve data(totalCount + bytesblock)

Dim bytesRead As Integer = stream.Read(data, totalCount, bytesblock)

If bytesRead = 0 Then

Exit While

End If

totalCount += bytesRead

End While

'---確保字節數組正確包含提取的字節數---

ReDim Preserve data(totalCount - 1)

Return data

Catch ex As Exception

MsgBox(ex.ToString)

Return Nothing

End Try

End Function

注意,在Decompress()函數中,你調用了RetrieveBytesFromStream()函數,如下所示:

dc_data = RetrieveBytesFromStream(zipStream, data.Length)

塊大小是指壓縮的數據的大小(data.length)。在大多數情況中,解壓縮的數據要比壓縮的數據大幾倍(由壓縮比所顯示),因此,在運行時刻期間你將至多動態地擴展字節數組幾倍。作為一個例子,假定壓縮比是百分之20而壓縮的數據的大小為2MB,那么,在這種情況中,解壓的數據將是10MB。因此,該字節數組將被動態地擴展5倍。理想情況下,在運行時刻期間該字節數組不應該被擴展太頻繁,因為這將會嚴重地減慢應用程序運行速度。但是使用壓縮的數據的大小作為塊大小確是一種好的辦法。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲一级免费视频| 亚洲一区二区久久| 日韩在线视频线视频免费网站| 国产+成+人+亚洲欧洲| 欧美精品18videosex性欧美| 精品久久久久人成| 韩曰欧美视频免费观看| 亚洲精品自产拍| 欧美国产日韩xxxxx| 亚洲综合在线做性| 亚洲美女又黄又爽在线观看| 日韩在线一区二区三区免费视频| 欧美另类老肥妇| 国产精品欧美日韩久久| 色老头一区二区三区在线观看| 国产精品嫩草视频| 91久久国产精品91久久性色| 国产亚洲综合久久| 欧美日韩在线另类| 久久99青青精品免费观看| 日韩有码视频在线| 国产成人亚洲综合青青| 久久久人成影片一区二区三区| 91久久精品国产| 国产精品国模在线| 伦伦影院午夜日韩欧美限制| 国产精品白丝jk喷水视频一区| 97精品一区二区视频在线观看| 国产精品久久久久久久久久久久| 欧美午夜片欧美片在线观看| 一本一本久久a久久精品牛牛影视| 久久97精品久久久久久久不卡| 国产美女91呻吟求| 国产精品美女主播在线观看纯欲| 国自在线精品视频| 在线观看中文字幕亚洲| 亚洲一区二区三区在线视频| 91情侣偷在线精品国产| 欧美不卡视频一区发布| 国产精品第一视频| 日韩有码在线视频| 日韩久久精品电影| 欧美大成色www永久网站婷| 久久精品91久久久久久再现| 在线播放日韩欧美| 欧美激情精品久久久久久黑人| 日韩高清电影好看的电视剧电影| 国内外成人免费激情在线视频| 2019中文字幕全在线观看| 国产精品一区二区三区免费视频| 91久久国产婷婷一区二区| 国产精品自拍偷拍视频| 国产精品自产拍高潮在线观看| 1769国产精品| 神马国产精品影院av| 欧美精品一本久久男人的天堂| 国产精品视频一区二区高潮| 自拍视频国产精品| 欧美性69xxxx肥| 亚洲电影中文字幕| 高跟丝袜欧美一区| 欧美激情亚洲视频| 久久男人资源视频| 亚洲成人激情在线| 欧美人与性动交a欧美精品| 亚洲第一页自拍| 亚洲精品欧美日韩专区| 国产不卡av在线免费观看| 欧美三级欧美成人高清www| 欧美超级免费视 在线| 亚洲品质视频自拍网| 久久综合久中文字幕青草| 久久成人精品视频| 久热99视频在线观看| 国产精品吴梦梦| 久久精品国产欧美激情| 日产日韩在线亚洲欧美| 亚洲人成在线观看网站高清| 色老头一区二区三区在线观看| 亚洲综合在线中文字幕| 国产精品美女免费视频| 国产一区红桃视频| 欧美色视频日本版| 亚洲aaa激情| 91久久久久久久一区二区| 国产亚洲精品久久久久久牛牛| 97香蕉超级碰碰久久免费软件| 韩国三级日本三级少妇99| 色噜噜狠狠色综合网图区| 欧美日韩亚洲精品内裤| 久久天天躁狠狠躁夜夜av| 国产亚洲精品高潮| 日韩av成人在线观看| 精品女同一区二区三区在线播放| 国产亚洲欧洲高清一区| 精品久久久视频| 精品久久久国产| 久久久久免费视频| 成人自拍性视频| 久久精品国产69国产精品亚洲| 久久精品夜夜夜夜夜久久| 欧美激情在线有限公司| 亚洲第一区中文字幕| 91视频免费网站| 欧美大片第1页| 热久久免费国产视频| 在线视频欧美日韩| 欧美成人免费在线视频| 国产精品福利无圣光在线一区| 日韩国产在线播放| 亚洲一区二区三区在线免费观看| 国产一区二区精品丝袜| 中文综合在线观看| 久久视频在线观看免费| 亚洲精品国产成人| 午夜精品福利视频| 欧美日韩中文字幕综合视频| 日本久久久久亚洲中字幕| 日产日韩在线亚洲欧美| 欧美午夜电影在线| 亚洲精品动漫100p| 91精品久久久久久久久青青| 91成人精品网站| 国产欧美精品一区二区| 91理论片午午论夜理片久久| 日韩精品极品在线观看| 久操成人在线视频| 国产亚洲欧洲高清| 国产亚洲精品美女| 亚洲欧美日韩国产中文专区| 欧美日韩国产色视频| 国产日产欧美精品| 亚洲精品网址在线观看| 亚洲日韩欧美视频| 欧美亚洲成人网| 欧美黑人一区二区三区| 亚洲一区二区三区毛片| 青青草国产精品一区二区| 久久久久中文字幕| 福利二区91精品bt7086| 高清日韩电视剧大全免费播放在线观看| 亚洲成人精品久久| 日韩电影在线观看永久视频免费网站| 国产亚洲精品激情久久| 最新国产精品拍自在线播放| 成人免费看黄网站| 久久99热精品这里久久精品| 九九九热精品免费视频观看网站| 亚洲电影免费观看高清完整版| 亚洲精品国产电影| 国产99久久精品一区二区| 国产精品一二三视频| 成人午夜高潮视频| 亚洲第一网站免费视频| 久久色精品视频| 午夜免费日韩视频| 欧美日韩国产一中文字不卡| 91夜夜揉人人捏人人添红杏| 69久久夜色精品国产69乱青草| 久久久www成人免费精品张筱雨| 欧美日韩精品国产| 久久久久久亚洲| 国产丝袜一区二区三区免费视频| 久久青草福利网站|