3

Read() 関数を適切に実装する方法がわからない Stream クラスを継承したので、ネストされた if が多くなり、コードをデバッグするのが難しくなりません。ポイントは、このストリームのソースからの読み取りは一定サイズのバッファー (変更不可など) を返しますが、Read() 関数は異なるバッファー サイズを受け入れることです。私は BufferedStream を追加することを考えましたが、それは悪い考えだと思います。手伝ってくれてありがとう!

4

2 に答える 2

1

内部ソースは固定サイズのバッファを返しますか?その場合、それはまったくそうではありませんBufferedStream-それは単に物理ストリームへの呼び出しの数を減らすだけです。キャッシュするには別のメカニズムが必要です。入力して空にするMemoryStreamが妥当な選択です。例(完全にテストされていません):

MemoryStream localBuffer = new MemoryStream();
bool ReadNextChunk()
{
    // clear
    localBuffer.Position = 0;
    localBuffer.SetLength(0);
    // get data
    byte[] chunk = null; // TODO - read from source
    if(chunk == null || chunk.Length == 0) return false; // EOF
    localBuffer.Write(chunk, 0, chunk.Length);
    localBuffer.Position = 0;
    return true;
}
public override int Read(byte[] buffer, int offset, int count)
{
    int bytes;
    if ((bytes = localBuffer.Read(buffer, offset, count)) > 0) return bytes;
    if (!ReadNextChunk()) return 0;
    return localBuffer.Read(buffer, offset, count);
}
于 2009-02-23T22:49:11.177 に答える
0

これがあなたの「10のスターター」です(それがグローバルに翻訳されるかどうかはわかりません)。

byte[] myBuffer = new byte[fixedSize];
int myBufferPos = fixedSize;

public int Read(byte[] buffer, int offset, int count)
{
    int copiedCount = 0
    while (copiedCount < count)
    {
        if (myBufferPos >= fixedSize)
        {
            //Read new fixed buffer into myBuffer
            // use break on no more buffer.
            myBufferPos = 0;
        }

        int bytesToCopy = fixedSize - myBufferPos;
        if (bytesToCopy > count - copiedCount)
            byteToCopy = count - copiedCount;

        Array.Copy(myBuffer, myBufferPos, buffer, offset, byteToCopy);

        offset += bytesToCopy;
        myBufferPos += bytesToCopy;
        copiedCount += bytesToCopy;
    }

    return copiedCount;
}

テストされていないので、いくつかのバグがあるかもしれません。ソースストリームの長さが固定サイズの正確な倍数であるかどうかは不明です。そうでない場合は、最後の部分バッファに少し追加のロジックが必要です。

基本的な原則は、固定サイズの独自のバッファーを維持し、読み取りによってこれまでに消費されたそのバッファー内の位置を追跡することです。

于 2009-02-23T22:50:15.603 に答える