0

以下のサンプルで、100 (buffer.Length + 100) を追加する必要がある理由を教えてください。buffer.Length は、解凍されたバッファーの長さと同じである必要があるため、さらに 100 を追加する必要はありません。:-)

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

前もって感謝します、ジョージ

4

2 に答える 2

3

なぜ彼らがそうしているのかはわかりませんが、一般的には良い例ではありません.たとえば、ステートメントを使用する代わりにClose(finallyブロックではなく)への明示的な呼び出しを使用しており、を 1 回呼び出すだけで、ファイル全体が読み取られます。一体、ファイル全体をバッファに読み込むことさえ悪い考えです.一度にチャンクを直接.FileStreamusingReadDeflateStream

これらのことから、この例に含まれるこの特定の奇妙なコード (余分な 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 に答える