Transformando uma string em um stream em C#: guia para iniciantes

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

Introdução: Por que você pode precisar de um stream a partir de uma string comum?

\n\n

Imagine a situação: você está escrevendo um aplicativo em C# que precisa processar alguns dados. Você os recebe como uma string comum, mas sua biblioteca ou método insiste em exigir um objeto do tipo Stream. O que fazer? Digitar manualmente? Procurar outro método? Não! Basta transformar a string em um stream.

\n\n

Esta é uma daquelas tarefas pequenas, mas muito frequentes, que todo desenvolvedor C# enfrenta. A pergunta "How do I generate a stream from a string?" no Stack Overflow acumulou milhares de visualizações — o que significa que o tema é realmente relevante. Neste artigo, vamos abordar não uma, mas várias formas de resolver, desde as mais simples até as mais flexíveis, e descobrir qual delas é melhor usar no seu projeto.

\n\n

Prontos? Vamos lá!

\n\n

Opção 1: O clássico — MemoryStream e Encoding

\n\n

A maneira mais direta e frequentemente usada é pegar a string, convertê-la em um array de bytes e, em seguida, encapsular esse array em um MemoryStream. Para converter a string em bytes, precisaremos da classe Encoding.

\n\n
using System;\nusing System.IO;\nusing System.Text;\n\npublic class StreamFromStringExample\n{\n    public static void Main()\n    {\n        string myString = "Olá, mundo! Esta é uma string para o stream.";\n        \n        // Converte a string em um array de bytes (usando UTF-8)\n        byte[] byteArray = Encoding.UTF8.GetBytes(myString);\n        \n        // Cria um stream a partir do array de bytes\n        using (MemoryStream stream = new MemoryStream(byteArray))\n        {\n            // Agora temos um stream! Podemos ler, escrever, etc.\n            Console.WriteLine($"Comprimento do stream: {stream.Length} bytes");\n            Console.WriteLine($"Posição no stream: {stream.Position}");\n            \n            // Exemplo: lê o stream de volta para uma string\n            stream.Position = 0; // Volta ao início\n            using (StreamReader reader = new StreamReader(stream, Encoding.UTF8))\n            {\n                string result = reader.ReadToEnd();\n                Console.WriteLine($"Lido do stream: {result}");\n            }\n        }\n    }\n}
\n\n

O que está acontecendo aqui?

\n
    \n
  • Encoding.UTF8.GetBytes() — transforma nossa string em uma sequência de bytes. Por que UTF-8? Porque é o padrão de fato para a internet e a maioria dos aplicativos modernos. Ele suporta todos os caracteres Unicode e é eficiente para o alfabeto latino.
  • \n
  • new MemoryStream(byteArray) — cria um stream que "encapsula" nosso array de bytes. O stream está pronto para leitura.
  • \n
\n\n

Este método é ideal quando você precisa criar um stream de forma simples e rápida para leitura única. É compacto e compreensível.

\n\n

Uma nuance importante: codificação

\n

Lembre-se sempre da codificação! Se você usar Encoding.ASCII em vez de Encoding.UTF8, perderá todos os caracteres que não fazem parte da tabela ASCII básica (por exemplo, as letras russas "Привет" se transformarão em "??????"). Para o português e qualquer outro texto, use Encoding.UTF8 ou Encoding.Unicode.

\n\n

Opção 2: StringReader — quando o stream é de texto, não de bytes

\n\n

E se você não precisar de um stream de bytes, mas sim de um stream de texto? Para isso, o C# tem a excelente classe StringReader. Ela não é uma subclasse de Stream, mas implementa a interface TextReader, o que muitas vezes é suficiente.

\n\n
using System;\nusing System.IO;\n\npublic class StringReaderExample\n{\n    public static void Main()\n    {\n        string data = "Linha 1\\nLinha 2\\nLinha 3";\n        \n        // Cria um StringReader\n        using (StringReader reader = new StringReader(data))\n        {\n            string line;\n            // Lê linha por linha\n            while ((line = reader.ReadLine()) != null)\n            {

Blogs

Book Recommendations