C# - Fundamentos : Converter Stream para um Array de bytes


 Na série C# Fundamentos vou abordar os conceitos básicos da linguagem C#. Hoje veremos como converter um Stream para um array de bytes.

O que é um Stream ?

Na linguagem C# você usa muitos tipos diferentes derivados de streams como FileStream e MemoryStream. Porém o tipo Stream não é usado diretamente pois é uma classe abstrata usada para streams derivados.

Assim, Stream é a classe base abstrata de todos os streams e fornece uma visão genérica de um strings de bytes. O objeto Stream envolve três operações fundamentais: Leitura, Escrita e Busca.

Em algumas situações, precisamos converter esses fluxos em um array de bytes. Vamos ver como fazer isso.

1 - Usando os métodos Read, Write e ToArray

using System;
using System.IO;
using System.Text;
namespace CSharp_Erros1
{
    class Program
    {
        static void Main(string[] args)
        {
            FileStream stream1 = File.Open("c:\\dados\\arquivo.txt", FileMode.Open);
            byte[] buff = ConverteStreamToByteArray(stream1);
            stream1.Close();
            Console.WriteLine(Encoding.UTF8.GetString(buff, 0, buff.Length));
        }
        public static byte[] ConverteStreamToByteArray(Stream stream)
        {
            byte[] byteArray = new byte[16 * 1024];
            using (MemoryStream mStream = new MemoryStream())
            {
                int bit;
                while ((bit = stream.Read(byteArray, 0, byteArray.Length)) > 0)
                {
                    mStream.Write(byteArray, 0, bit);
                }
                return mStream.ToArray();
            }
        }
    }
} 

O método Read do stream lê uma sequência de bytes do stream atual e avança a posição dentro do stream até o número de bytes lidos.

A seguir usa o método Write para gravar uma sequência de bytes no stream atual e avança a posição atual dentro desse stream até o número de bytes gravados.

Aqui o método MemoryStream.ToArray() escreve o conteúdo do stream em um array de bytes independente da propriedade Position.

2 - Usando os métodos CopyTo() e ToArray()

using System;
using System.IO;
using System.Text;
namespace CSharp_Erros1
{
    class Program
    {
        static void Main(string[] args)
        {
            FileStream stream1 = File.Open("c:\\dados\\arquivo.txt", FileMode.Open);
            byte[] buff = ConverteStreamToByteArray2(stream1);
            stream1.Close();
            Console.WriteLine(Encoding.UTF8.GetString(buff, 0, buff.Length));
        }
        public static byte[] ConverteStreamToByteArray2(Stream stream)
        {
            using (MemoryStream ms = new MemoryStream())
            {
                stream.CopyTo(ms);
                return ms.ToArray();
            }
        }
    }
}
 

O método CopyTo lê os bytes do stream atual, iniciando na posição atual, e os grava em outro stream.

Aqui o método MemoryStream.ToArray()  atua da seguinte forma:

- Escreve o conteúdo do stream em um array de bytes independente da propriedade Position.
- Omite os bytes não utilizados no MemoryStream do array. Para obter o buffer inteiro, use o método GetBuffer.
- Retorna uma cópia do conteúdo do MemoryStream como um array de bytes. Se a instância atual foi construída em um array de bytes fornecido, uma cópia da seção do array à qual essa instância tem acesso será retornada.

E estamos conversados...

"Vinde a mim, todos os que estais cansados e oprimidos, e eu vos aliviarei."(disse Jesus)
Mateus 11:28

Veja os Destaques e novidades do SUPER DVD Visual Basic (sempre atualizado) : clique e confira !

Quer migrar para o VB .NET ?

Quer aprender C# ??

Quer aprender os conceitos da Programação Orientada a objetos ?

Quer aprender o gerar relatórios com o ReportViewer no VS 2013 ?

Referências:


José Carlos Macoratti