任何想法为什么在下面的示例中,我们需要添加100(buffer.Length + 100)? buffer.Length应该与解压缩缓冲区长度相同,因此不需要再添加100个。 : - )
提前谢谢, 乔治答案 0 :(得分:3)
我不知道他们为什么要这样做,但它一般不是一个很好的例子 - 例如,他们在{{Close
上使用显式调用(不是在finally块中) 1}}而不是使用FileStream
语句,并假设对using
的单个调用将读取整个文件。哎呀,即使将整个文件读入缓冲区也是一个坏主意 - 最好一次将一个块复制到Read
。
这些事情告诉我,在这个例子中,不值得担心这个特定的奇数位代码(额外的100个字节)。当然不要把它当作“最佳实践”。
MSDN示例通常比这更好 - 尽管还有很多其他奇怪的例子。
编辑:重新阅读代码和CodeMelt的答案后,确实需要额外的100个字节 - 但这只是因为ReadAllBytesFromStream的实现非常糟糕。这是一个更好的实现,它总是要求流填充缓冲区的其余部分:DeflateStream
(请注意,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
都不需要,因为它们总是具有相同的值。)
答案 1 :(得分:2)
它阻止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;
}