0

任何想法为什么在下面的示例中,我们需要添加 100 (buffer.Length + 100)?buffer.Length 应该和解压后的缓冲区长度一样,所以不需要再增加100。:-)

http://msdn.microsoft.com/en-us/library/bc2dbwea.aspx

提前谢谢,乔治

4

2 回答 2

3

我不知道他们为什么要这样做,但这通常不是一个很好的例子——例如,他们使用显式调用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它们总是具有相同的值。)

于 2009-02-22T12:22:06.557 回答
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;
} 
于 2009-02-22T12:24:16.787 回答