任何想法为什么在下面的示例中,我们需要添加 100 (buffer.Length + 100)?buffer.Length 应该和解压后的缓冲区长度一样,所以不需要再增加100。:-)
http://msdn.microsoft.com/en-us/library/bc2dbwea.aspx
提前谢谢,乔治
任何想法为什么在下面的示例中,我们需要添加 100 (buffer.Length + 100)?buffer.Length 应该和解压后的缓冲区长度一样,所以不需要再增加100。:-)
http://msdn.microsoft.com/en-us/library/bc2dbwea.aspx
提前谢谢,乔治
我不知道他们为什么要这样做,但这通常不是一个很好的例子——例如,他们使用显式调用Close
(而不是在 finally 块中)FileStream
而不是使用using
语句,并且还假设一次调用Read
将读取整个文件。哎呀,即使将整个文件读入缓冲区也是一个坏主意——最好一次将一个块直接复制到DeflateStream
.
这些事情向我表明,在该示例中不必担心这个特定的奇数位代码(额外的 100 个字节)。当然不要将其视为“最佳实践”。
MSDN 的例子通常比这更好——尽管还有很多其他奇怪的例子。
编辑:重新阅读代码和 CodeMelt 的答案后,它确实需要额外的 100 个字节——但这只是因为 ReadAllBytesFromStream 的实现如此糟糕。这是一个更好的实现,它总是要求流填充缓冲区的其余部分:
public static int ReadAllBytesFromStream(Stream stream, byte[] buffer)
{
int offset = 0;
int bytesRead;
while ((bytesRead = stream.Read(buffer, offset,
buffer.Length-offset)) > 0)
{
offset += bytesRead;
}
return offset;
}
(请注意,两者都不需要,offset
因为totalCount
它们总是具有相同的值。)
它可以防止 stream.Read(buffer, offset, 100) 在以下方法中超过其长度,因为流一直在读取,直到它什么也没读。
public static int ReadAllBytesFromStream(Stream stream, byte[] buffer)
{
// Use this method is used to read all bytes from a stream.
int offset = 0;
int totalCount = 0;
while (true)
{
// even it reads to the end, but it will still read the next
// 100 bytes to see if anything has been read.
int bytesRead = stream.Read(buffer, offset, 100);
if ( bytesRead == 0)
{
break;
}
offset += bytesRead;
totalCount += bytesRead;
}
return totalCount;
}