以下のサンプルで、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ブロックではなく)への明示的な呼び出しを使用しており、を 1 回呼び出すだけで、ファイル全体が読み取られます。一体、ファイル全体をバッファに読み込むことさえ悪い考えです.一度にチャンクを直接.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;
}