这个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倍。理想情况下,在运行时刻期间该字节数组不应该被扩展太频繁,因为这将会严重地减慢应用程序运行速度。但是使用压缩的数据的大小作为块大小确是一种好的办法。