FileStream vs / diferenças StreamWriter?

85

Questão:

O que é diferente entre FileStreame StreamWriterem .Net ?

Em que contexto você deve usá-lo? Qual é a sua vantagem e desvantagem?

É possível combinar esses dois em um?

E aí
fonte

Respostas:

98

O que é diferente entre FileStream e StreamWriter no dotnet?

A FileStreamé a Stream. Como todos os Streams, ele lida apenas com byte[]dados.

A StreamWriter : TextWriter, é decorador de stream. Um TextWriter codifica dados de texto como string ou char byte[]e, em seguida, os grava no link Stream.

Em que contexto você deve usá-lo? Qual é a sua vantagem e desvantagem?

Você usa um FileStream vazio quando tem byte[]dados. Você adiciona um StreamWriterquando quiser escrever um texto. Use um formatador ou serializador para gravar dados mais complexos.

É possível combinar esses dois em um?

Sim. Você sempre precisa de um Stream para criar um StreamWriter. O método auxiliar System.IO.File.CreateText("path")irá criá-los em combinação e então você só precisa Dispose () o gravador externo.

Henk Holterman
fonte
4
Também é importante notar que FileStreamé um tipo de fluxo, que é especificamente adaptado para arquivos. Streams nativamente funcionam com bytes, no entanto StreamWriter/ Reader irá escrever / ler texto em qualquer stream, não apenas FileStreams. Por exemplo, MemoryStreams, NetworkStreams, etc ..
iliketocode
19

FileStream grava bytes, StreamWriter grava texto. Isso é tudo.

Hans Passant
fonte
14
Na verdade, isso não é "tudo" ... Mas é uma diferença correta.
David
14

Um FileStream se destina explicitamente a arquivos de trabalho.

Um StreamWriter pode ser usado para transmitir para qualquer tipo de Stream - sockets de rede, arquivos, etc.

ScottGu explica os diferentes objetos Stream muito bem aqui: http://www.codeguru.com/Csharp/Csharp/cs_data/streaming/article.php/c4223

David
fonte
1
Excelente referência para fluxos, embora não cubra fluxos R / W de acesso aleatório. Especialmente as informações de serialização / desserialização e a demonstração de fluxos sem arquivos são muito úteis. +1
ThunderGr
7

Bem, do MSDN para FileStream:

Expõe um fluxo em torno de um arquivo, suportando operações de leitura e gravação síncronas e assíncronas.

e o MSDN para StreamWriter:

Implementa um TextWriter para gravar caracteres em um fluxo em uma codificação específica.

A diferença mais óbvia é que FileStreampermite operações de leitura / gravação, enquanto StreamWriteré somente gravação.

A StreamWriterpágina continua para adicionar:

StreamWriter é projetado para saída de caracteres em uma codificação específica, enquanto classes derivadas de Stream são projetadas para entrada e saída de bytes.

Portanto, uma segunda diferença é FileStreampara bytes, enquanto StreamWriteré para texto.

ChrisF
fonte
6

Eles são dois níveis diferentes usados ​​na saída de informações para fontes de dados conhecidas.

A FileStreamé um tipo de fluxo, que é conceitualmente um mecanismo que aponta para algum local e pode manipular dados de entrada e / ou saída de e para esse local. Streams existem para leitura / gravação em arquivos, conexões de rede, memória, canais, o console, ouvintes de depuração e rastreamento e alguns outros tipos de fontes de dados. Especificamente, FileStreamexiste um para executar leituras e gravações no sistema de arquivos. A maioria dos fluxos é de baixo nível de uso e trata os dados como bytes.

A StreamWriteré um wrapper para um Stream que simplifica o uso desse stream para gerar texto simples. Ele expõe métodos que pegam strings em vez de bytes e executa as conversões necessárias de e para matrizes de bytes. Existem outros escritores; o outro principal que você usaria é o XmlTextWriter, que facilita a gravação de dados no formato XML . Existem também contrapartes do Reader para os gravadores que também envolvem um fluxo e facilitam a recuperação dos dados.

KeithS
fonte
0

Uma diferença importante (além dos comentários acima) pode ser que FileStream suporta leitura e gravação de acesso aleatório de disco em qualquer FileStream.Position especificada. Para modificações em arquivos grandes, isso pode ser inestimável.

beanmf
fonte