1034 votes

Création d’un tableau d’octets dans un flux

Quelle est la méthode préférée pour la création d’un tableau d’octets dans un flux d’entrée ?

Voici ma solution actuelle avec .NET 3.5.

Est-ce encore une meilleure idée pour lire et écrire des morceaux du flux ?

1406voto

Jon Skeet Points 692016

Cela dépend vraiment de si oui ou non vous pouvez faire confiance s.Length. Pour de nombreux cours d'eau, vous juste ne sais pas combien de données il y aura. Dans de tels cas, je préfère utiliser le code comme ceci:

public static byte[] ReadFully(Stream input)
{
    byte[] buffer = new byte[16*1024];
    using (MemoryStream ms = new MemoryStream())
    {
        int read;
        while ((read = input.Read(buffer, 0, buffer.Length)) > 0)
        {
            ms.Write(buffer, 0, read);
        }
        return ms.ToArray();
    }
}

EDIT: je devrais peut-être expliquer pourquoi ma réponse est plus long que les autres. Flux de données.Lire n'est pas une garantie qu'il va lire tout ce qu'il est demandé. Si vous êtes à la lecture d'un flux réseau, par exemple, il peut lire un paquet vaut le coup et puis le retour, même si il y aura plus de données à bientôt. BinaryReader.Lire va continuer jusqu'à la fin de la rivière ou de votre taille spécifiée, mais vous avez encore de connaître la taille pour commencer.

La méthode ci-dessus continuerai à le lire (et de copie dans un MemoryStream) jusqu'à ce qu'il ne manque de données. Il demande alors à l'MemoryStream de retourner une copie des données dans un tableau. Si vous connaissez la taille pour commencer (ou pense que vous connaissez la taille, sans en être sûr - vous pouvez construire MemoryStream être de cette taille pour commencer. De même, vous pouvez mettre un chèque à la fin, et si la longueur du cours d'eau est la même que la taille de la mémoire tampon (retourné par la MemoryStream.GetBuffer), alors vous pouvez simplement retourner le tampon. Donc le code ci-dessus n'est pas très optimisé, mais au moins correct. Il n'assume aucune responsabilité pour la fermeture du flux de l'appelant devrait le faire.

Voir cet article pour plus d'info (et une variante de mise en œuvre).

843voto

Nathan Phillips Points 2849

Alors que la réponse de Jon est correcte, il est réécriture de code qui existe déjà dans CopyTo. Ainsi, pour la solution de .net 4 utilisation Sandip, mais pour une version antérieure de .net utiliser réponse de Jon. Code de Sandip serait améliorée par l’utilisation de le « utilisation » comme exceptions au CopyTo sont, dans bien des situations tout à fait probables et laisseraient le MemoryStream ne pas éliminé.

125voto

Fernando Neira Points 1049

Je veux juste faire remarquer que dans le cas où vous avez un MemoryStream vous avez déjà `` pour cela.

Aussi, si vous êtes traitant de flux inconnu ou différents sous-types et vous pouvez recevoir un `` , vous pouvez relayer sur ledit procédé dans les cas et toujours utiliser la réponse acceptée pour les autres, comme ceci :

74voto

Sandip Patel Points 287
MemoryStream ms = new MemoryStream();
file.PostedFile.InputStream.CopyTo(ms);
var byts = ms.ToArray();
ms.Dispose();

55voto

Alex Wheat Points 928

juste mes cents couple... la pratique que j’utilise souvent consiste à organiser les méthodes comme ceci comme une assistance personnalisée

Ajoutez l’espace de noms dans le fichier de config et l’utiliser n’importe où que vous le souhaitez

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X