Pergunta

Streams são uma espécie de misterioso para mim. Eu não sei quando usar cada riacho e como usá-los. Alguém pode me explicar como fluxos são usados?

Se bem entendi, existem três tipos de fluxo:

  • stream
  • read stream
  • write stream

Isso é correto? E, por exemplo, qual é a diferença entre um Memorystream e uma FileStream?

Foi útil?

Solução

A fluxo é um objecto usado para a transferência de dados. Há uma classe de fluxo genérico System.IO.Stream , a partir do qual todas as outras classes de fluxo em .NET são derivados. As ofertas de classe Stream com bytes.

As classes de fluxo de concreto são utilizados para lidar com outros tipos de dados do que bytes. Por exemplo:

  • A classe FileStream é usado quando a fonte externa é um arquivo
  • MemoryStream é usado para armazenar dados na memória
  • dados da rede alças System.Net.Sockets.NetworkStream

leitor / gravador de córregos, como StreamReader e StreamWriter não são córregos - eles não são derivados de System.IO.Stream, eles são projetados para ajudar a escrever e ler dados de e para fluxo

Outras dicas

Para expandir um pouco sobre outras respostas aqui, e ajudam a explicar um monte de código de exemplo, você verá espalhadas sobre, na maioria das vezes você não ler e gravar em um fluxo diretamente. Streams são um meio de baixo nível para transferência de dados.

Você notará que as funções para leitura e escrita são todos byte orientado, por exemplo, WriteByte (). Não há funções para lidar com números inteiros, cordas etc. Isso faz com que o fluxo muito de uso geral, mas menos simples para trabalhar com se, digamos, você quiser apenas para texto transferência.

No entanto, .NET fornece classes que converso entre tipos nativos e a interface transmitir de baixo nível, e transfere os dados para ou a partir do fluxo para você. Alguns notáveis ??tais classes são:

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

Para usá-los, primeiro você adquirir o seu fluxo, então você criar uma das classes acima e associá-lo com o fluxo. Por exemplo.

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

StreamReader e StreamWriter converso entre tipos nativos e suas representações de corda, em seguida, transferir as cordas de e para o fluxo de bytes. Então

myStreamWriter.Write(123);

vai escrever "123" (três caracteres '1', '2' então '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

myBinaryWriter.Write(123);

vai escrever quatro bytes que representa o valor inteiro de 32-bit 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 em outros sistemas, você precisa estar atento a endianness , mas isso é outro post).

Streams são bons para lidar com grandes quantidades de dados. Quando é impraticável para carregar todos os dados na memória, ao mesmo tempo, você pode abri-lo como um fluxo e trabalhar com pequenos pedaços dele.

Stream é apenas uma abstração (ou um invólucro) sobre um córrego physical de bytes. Este fluxo physical é chamado o base stream. Assim, há sempre um fluxo de base sobre a qual um invólucro de fluxo é criado e, portanto, o invólucro é nomeado após o tipo de fluxo de base ou seja FileStream, MemoryStream etc.

A vantagem do fluxo invólucro é que você começa uma API unificada para interagir com correntes de qualquer tipo subjacente usb, file etc.

Por que você iria tratar os dados como fluxo - porque blocos de dados são carregados sob demanda, podemos inspecionar / processar os dados como pedaços em vez de carregar todos os dados em memória. Isto é como a maioria dos programas de lidar com arquivos grandes, por exemplo, para criptografar um arquivo de imagem OS.

Existe apenas um tipo básico de Stream. No entanto, em várias circunstâncias alguns membros irá lançar uma exceção quando chamado porque, nesse contexto, a operação não estava disponível.

Por exemplo, um MemoryStream é simplesmente uma maneira de movimentos bytes dentro e fora de um bloco de memória. Daí você pode chamar ler e escrever sobre ele.

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

Gostaria de começar por ler sobre fluxos no MSDN: http://msdn.microsoft.com/en-us/ biblioteca / system.io.stream.aspx

Memorystream e FileStream são correntes utilizadas para o trabalho com a memória cru e Arquivos, respectivamente ...

Eu não chamaria os diferentes tipos de fluxos. A classe Stream tem canread e CanWrite propriedades que indicam se o fluxo particular pode ser lidos e gravados a.

A principal diferença entre as diferentes classes de fluxo (como MemoryStream vs FileStream) é o armazenamento de backup - onde os dados são lidos ou onde está escrito. É meio óbvio a partir do nome. Um MemoryStream armazena os dados na memória somente, um FileStream é apoiado por um arquivo no disco, um NetworkStream lê dados da rede e assim por diante.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top