Streams são meio misteriosos para mim. Não sei quando usar qual stream e como usá-los. Alguém pode me explicar como os streams são usados?
Se bem entendi, existem três tipos de fluxo:
stream
read stream
write stream
Isso está correto? E, por exemplo, qual é a diferença entre a Memorystream
e a FileStream
?
Stream
) que expõe alguns métodos úteis, como leitura, escrita e mudança de posição. Agora você pode criar classes com base em seu armazenamento de apoio (FileStream, MemoryStream) que herdamStream
e se baseiam nessa funcionalidade com base no armazenamento de apoio específico.Respostas:
Um fluxo é um objeto usado para transferir dados. Há uma classe de fluxo genérica
System.IO.Stream
, da qual todas as outras classes de fluxo no .NET são derivadas. AStream
classe lida com bytes.As classes de fluxo concreto são usadas para lidar com outros tipos de dados além de bytes. Por exemplo:
FileStream
classe é usada quando a fonte externa é um arquivoMemoryStream
é usado para armazenar dados na memóriaSystem.Net.Sockets.NetworkStream
lida com dados de redeFluxos de leitor / gravador como
StreamReader
eStreamWriter
não são fluxos - eles não são derivadosSystem.IO.Stream
, são projetados para ajudar a escrever e ler dados de e para fazer o streaming!fonte
Para expandir um pouco as outras respostas aqui, e ajudar a explicar muito do código de exemplo que você verá espalhado, na maioria das vezes você não lê e grava em um fluxo diretamente. Streams são um meio de baixo nível para transferir dados.
Você notará que as funções de leitura e escrita são todas orientadas por bytes, por exemplo, WriteByte (). Não há funções para lidar com inteiros, strings etc. Isso torna o fluxo de uso muito geral, mas menos simples de trabalhar se, digamos, você quiser apenas transferir texto.
No entanto, o .NET fornece classes que convertem entre tipos nativos e a interface de fluxo de baixo nível e transfere os dados de ou para o fluxo para você. Algumas dessas classes notáveis são:
Para usá-los, primeiro você adquire seu fluxo, depois cria uma das classes acima e a associa ao fluxo. Por exemplo
StreamReader e StreamWriter convertem entre tipos nativos e suas representações de string e então transferem as strings de e para o fluxo como bytes. assim
irá escrever "123" (três caracteres '1', '2' e depois '3') no stream. Se você estiver lidando com arquivos de texto (por exemplo, html), StreamReader e StreamWriter são as classes que você usaria.
Enquanto que
gravará quatro bytes que representam o valor inteiro de 32 bits 123 (0x7B, 0x00, 0x00, 0x00). Se você estiver lidando com arquivos binários ou protocolos de rede, BinaryReader e BinaryWriter são o que você pode usar. (Se estiver trocando dados com redes ou outros sistemas, você precisa estar atento ao endianness , mas isso é outro post.)
fonte
Os fluxos são bons para lidar com grandes quantidades de dados. Quando é impraticável carregar todos os dados na memória ao mesmo tempo, você pode abri-lo como um fluxo e trabalhar com pequenos pedaços dele.
fonte
Stream é apenas uma abstração (ou um invólucro) sobre um
physical
stream de bytes. Estephysical
fluxo é chamado debase stream
. Portanto, sempre há um fluxo base sobre o qual um wrapper de fluxo é criado e, portanto, o wrapper é nomeado após o tipo de fluxo baseFileStream
, ou seja ,MemoryStream
etc.A vantagem do wrapper de fluxo é que você obtém uma API unificada para interagir com fluxos de qualquer tipo subjacente,
usb, file
etc.Por que você trataria os dados como fluxo - porque os fragmentos de dados são carregados sob demanda, podemos inspecionar / processar os dados como fragmentos em vez de carregar os dados inteiros na memória. É assim que a maioria dos programas lida com arquivos grandes, por exemplo, para criptografar um arquivo de imagem do sistema operacional.
fonte
Existe apenas um tipo básico de
Stream
. No entanto, em várias circunstâncias, alguns membros lançarão uma exceção quando chamados porque, nesse contexto, a operação não estava disponível.Por exemplo, a
MemoryStream
é simplesmente uma maneira de mover bytes para dentro e para fora de um bloco de memória. Portanto, você pode chamar Read e Write nele.Por outro lado, um
FileStream
permite que você leia ou escreva (ou ambos) de / para um arquivo. Se você pode realmente ler ou gravar depende de como o arquivo foi aberto. Você não pode gravar em um arquivo se você apenas o abriu para acesso de leitura.fonte
Eu começaria lendo sobre streams no MSDN: http://msdn.microsoft.com/en-us/library/system.io.stream.aspx
Memorystream e FileStream são streams usados para trabalhar com memória bruta e arquivos respectivamente ...
fonte
Eu não chamaria esses tipos diferentes de streams. A classe Stream possui as propriedades CanRead e CanWrite que informam se o fluxo específico pode ser lido e gravado.
A principal diferença entre diferentes classes de fluxo (como MemoryStream vs FileStream) é o armazenamento de apoio - de onde os dados são lidos ou onde são gravados. É meio óbvio pelo nome. Um MemoryStream armazena os dados apenas na memória, um FileStream é apoiado por um arquivo em disco, um NetworkStream lê os dados da rede e assim por diante.
fonte