C# usando fluxos

As correntes são um pouco misteriosas para mim. Não sei quando usar o riacho e como usá-los. Alguém pode explicar-me como são usados os fluxos?

Se bem entendi, há três tipos de corrente:

  • stream
  • read stream
  • write stream
Isto está correcto? E, por exemplo, Qual é a diferença entre a Memorystream e a FileStream?

 91
Author: LightCC, 2009-09-10

7 answers

A stream é um objecto utilizado para transferir dados. Existe uma classe de fluxo GenéricoSystem.IO.Stream, a partir da qual todas as outras classes de fluxo em.Net são derivadas. A classe Stream lida com bytes.

As classes de corrente de betão são usadas para lidar com outros tipos de dados que não bytes. Por exemplo:

  • a classe FileStream é usada quando a fonte externa é um ficheiro
  • MemoryStream é utilizado para armazenar dados na memória
  • System.Net.Sockets.NetworkStream lida com a rede data

Fluxos de leitores/escritores como StreamReader e StreamWriter não são fluxos - eles não são derivados de {[[0]}, eles são projetados para ajudar a escrever e ler os dados de e para stream!

 54
Author: Arsen Mkrtchyan, 2017-10-24 04:36:05

Para expandir um pouco sobre outras respostas aqui, e ajudar a explicar um monte do código de exemplo que você verá pontilhado sobre, na maioria das vezes você não lê e escreve para um fluxo diretamente. Os fluxos são um meio de baixo nível para transferir dados.

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. Isto torna o fluxo de propósito muito geral, mas menos simples de trabalhar com se, digamos, você apenas quero transferir o texto.

No entanto, o. Net fornece classes que convertem entre os 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:

StreamWriter // Badly named. Should be TextWriter.
StreamReader // Badly named. Should be TextReader.
BinaryWriter
BinaryReader

Para usar estes, primeiro você adquire o seu fluxo, então você cria uma das classes acima e associá-lo com o fluxo. Por exemplo

MemoryStream memoryStream = new MemoryStream();
StreamWriter myStreamWriter = new StreamWriter(memoryStream);

O leitor de fluxo e o redator de fluxo convertem entre os tipos nativos e as suas representações de cadeias de caracteres e depois transferem as cadeias de caracteres de e para o riacho como bytes. Então

myStreamWriter.Write(123);

Vai escrever " 123 " (três caracteres '1', '2' e '3') para o fluxo. Se você está lidando com arquivos de texto (por exemplo, html), StreamReader e StreamWriter são as classes que você usaria.

Considerando que

myBinaryWriter.Write(123);

Irá escrever quatro bytes representando o valor inteiro de 32 bits 123 (0x7B, 0x00, 0x00, 0x00). Se você está lidando com arquivos binários ou protocolos de rede BinaryReader e BinaryWriter são o que você pode usar. (Se você está trocando dados com redes ou outros sistemas, você precisa estar atento a endianness, mas isso é outro post.)

 42
Author: Tim Williams, 2017-05-23 11:47:01
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.
 16
Author: meatvest, 2009-09-10 09:47:54
Eu começaria por ler os fluxos em MSDN: http://msdn.microsoft.com/en-us/library/system.io.stream.aspx

Memoristream e FileStream são fluxos usados para trabalhar com memória raw e arquivos, respectivamente...

 3
Author: Robban, 2009-09-10 09:44:06

Existe apenas um tipo básico de Stream. No entanto, em várias circunstâncias, alguns deputados abrirão uma excepção quando convocados, porque nesse contexto a operação não estava disponível.

Por exemplo a MemoryStream é simplesmente uma maneira de mover bytes dentro e fora de um pedaço de memória. Por isso podes ligar para o Read e escrever nele.

Por outro lado a FileStream permite-lhe ler ou escrever (ou ambos) de/para um ficheiro. Se você pode realmente ler ou escrever depende de como o ficheiro foi aberto. Você não pode escrever para um arquivo se você só abriu para o acesso de leitura.

 3
Author: AnthonyWJones, 2009-09-10 09:45:42

O fluxo é apenas uma abstração (ou um invólucro) sobre um fluxo physical de bytes. Este Riacho physical é chamado de base stream. Então há sempre um fluxo de base sobre o qual um invólucro de fluxo é criado e, assim, o invólucro é nomeado após o tipo de fluxo de base ie FileStream, MemoryStream etc.

A vantagem do invólucro do fluxo é que você obtém uma api unificada para interagir com fluxos de qualquer tipo subjacente usb, file etc.

Porque tratarias os dados como transmissão - dados os blocos são carregados a pedido, podemos inspecionar / processar os dados como blocos em vez de carregar os dados inteiros na memória. Esta é a forma como a maioria dos programas lidar com arquivos grandes, por exemplo, criptografar um arquivo de imagem OS.

 2
Author: Anwar Husain, 2016-07-20 11:25:34
Eu não chamaria a esse tipo de riachos diferentes. A classe Stream tem propriedades CanRead e CanWrite que lhe dizem se o stream em particular pode ser lido de e escrito para.

A principal diferença entre diferentes classes de fluxo (como Memoristream vs FileStream) é a loja de suporte - onde os dados são lidos ou onde é escrito para. É óbvio pelo nome. Um Memoristream armazena os dados apenas na memória, um FileStream é suportado por um arquivo no disco, um NetworkStream lê dados da rede e assim por diante.

 1
Author: Mattias S, 2009-09-10 09:46:00