2010-09-16 16 views
0
public static void ReadWholeArray (Stream stream, byte[] data) 
{ 
    int offset=0; 
    int remaining = data.Length; 
    while (remaining > 0) 
    { 
     int read = stream.Read(data, offset, remaining); 
     if (read <= 0) 
      throw new EndOfStreamException(String.Format("End of stream reached with {0} bytes left to read", remaining)); 
     remaining -= read; 
     offset += read; 
    } 
} 
taille

de données de tableau d'octets est 2682 sur la première itération de la boucle while la valeur de lecture est 1658 sur l'itération suivante après l'exécution de la lignedans la méthode Stream.read() dans C# .net

int read = stream.Read(data, offset, remaining); 

le programme ne répond pas

quel est le problème?

+0

Connaissant le genre de flux est assez important pour être en mesure de vous répondre correctement – jgauffin

+0

pourquoi avez-vous de lire les données de flux manuellement? – Grzenio

+0

Grzenio! Quelle est l'autre façon de lire les données à partir du flux –

Répondre

1

Quelle que soit FOURNIT votre flux bloque jusqu'à ce que les données sont disponibles. A partir de docs MSDN sur Stream.Read:

La mise en œuvre bloquera jusqu'à ce qu'au moins un octet de données peuvent être lues, dans le cas où aucune donnée est disponible. Read retourne 0 seulement quand il n'y a pas plus de données dans le flux et plus est prévu (par exemple une prise fermée ou fin du fichier)

Vous pouvez définir un délai d'attente de lecture sur le flux pour éviter bloquer pour toujours.

En aparté, notez que la lecture du flux se déplace la position actuelle, donc avec votre logique de décalage, vous pouvez sauterons gros morceaux du flux d'entrée.

0

Vous n'avez pas défini ReadTimeout au cours d'eau et il n'y a pas de données pour que les blocs d'appel jusqu'à ce que des données sont disponibles.

Vérifiez les propriétés du flux .ReadTimeout et .WriteTimeout.

En outre, ont à l'esprit que vous connaissez les données dont vous avez besoin, mais pas le volume de données viennent (échoue, les bugs, etc.) de sorte que vous devriez vérifier aussi.

-1

Vous pouvez essayer. Ce code sera lu octets de flux à l'octet []:

public static byte[] GetBytesFromStream() 
    { 
     FileStream fs = new FileStream("d:/pic.jpg", FileMode.Create); 
     byte[] bytes = new byte[fs.Length]; 
     fs.Read(bytes, 0, (int)fs.Length); 
     fs.Close(); 
     return bytes; 
    } 
+0

Cela a toujours le problème de FileStream.Read ne retient pas toutes les données, de sorte que vous auriez besoin d'une boucle pour vous assurer que toutes les données sont lues. – SwDevMan81

+0

il existe déjà une méthode pour cela. File.ReadAllBytes() – Bryan