C# usando fluxos
Se bem entendi, há três tipos de corrente:
stream
read stream
write stream
Memorystream
e a FileStream
?
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!
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.)
Memoristream e FileStream são fluxos usados para trabalhar com memória raw e arquivos, respectivamente...
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.
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.
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.