2009-02-23 6 views
3

J'ai hérité de la classe Stream, dans laquelle je ne sais pas comment implémenter la fonction Read() correctement, donc je ne finirai pas avec beaucoup d'ifs imbriqués et difficile à déboguer du code. Le point est que la lecture de la source de ce flux retourne un tampon de taille constante (par exemple non modifiable), mais la fonction Read() accepte différentes tailles de tampon. Je pense à ajouter BufferedStream, mais je pense que c'est une mauvaise idée. Merci pour l'aide!Flux hérité; tampon dans Read()

Répondre

1

La source interne renvoie des tampons de taille fixe? Si tel est le cas, ce n'est pas tout à fait ce que fait BufferedStream - cela réduit simplement le nombre d'appels à un flux physique. Vous auriez besoin d'un mécanisme séparé pour mettre en cache - un MemoryStream que vous remplissez et videz serait un choix raisonnable. Par exemple (complètement non testé):

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); 
} 
0

Voici votre "starter pour 10" (pas sûr si cela se traduit au niveau mondial).

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; 
} 

Untested peut avoir quelques bugs. Il n'est pas clair si votre flux source a une longueur de multiples exacts de sa taille fixe. Si ce n'est pas le cas, le tampon partiel final nécessite une petite logique supplémentaire.

Le principe de base est de maintenir votre propre tampon de la taille fixe et de suivre la position dans ce tampon jusqu'ici consommé par les lectures