IO 101: Quais são as principais diferenças entre TextWriter, FileStream e StreamWriter?

StackOverflow https://stackoverflow.com/questions/1010555

  •  06-07-2019
  •  | 
  •  

Pergunta

Deixe-me primeiro desculpas se esta pergunta poderia soar talvez espécie de amador para os programadores experientes entre vós, a coisa é eu tenho tido muitas discussões sobre isso no trabalho para que eu realmente quero ver se entendi e isso é basicamente por isso que eu 'm contando com a comunidade stackoverflow para obter este resolvido de uma vez por todas:)

Assim, por um lado, de acordo com MSDN, temos:

TextWriter Classe

Representa um escritor que pode escrever um séries sequenciais de caracteres. este classe é abstrata.

FileStream Classe

Expõe um Stream em torno de um arquivo, suportando tanto síncrono e leitura assíncrona e escrita operações.

StreamWriter Classe

Implementa um TextWriter para a escrita caracteres para um fluxo de uma determinada codificação.

Por outro lado, é evidente que todos eles pertencem System.IO mas dado que exemplos do MSDN tipo de misturar alguns deles, eu ainda não estou alcançando o tão desejado a-ha momento.

Qualquer comentário seria mais do que apreciado, muito obrigado antecipadamente!

Foi útil?

Solução

Streams alça bytes , Writers alça caracteres .

Bytes! = caracteres. Um personagem pode levar mais de um byte para representar. O mapeamento de caracteres para bytes é chamado de codificação .

A FileStream refere-se aos bytes sendo gravados em um arquivo, semelhante à forma como um MemoryStream refere-se ao bytes escritos para um buffer na memória. Para escrever caracteres para um fluxo, você precisa convertê-los em uma seqüência de bytes. É aí que um StreamWriter vem para jogar. Ele leva uma sequência de caracteres e uma codificação, e transforma-o em uma sequência de bytes.

A TextWriter é uma interface (bem, abstrato classe base) que todos os escritores devem aderir. Tem todas as operações baseadas em caracteres. O equivalente de bytes é a classe base abstrata Stream.

As coisas também ir na direção oposta. Há uma classe TextReader resumo de base, que descreve como ler caracteres a partir de um lugar, e um StreamReader, que permite a leitura de caracteres a partir de um fluxo orientado de byte que fornecem uma codificação - mas desta vez utilizada no sentido inverso, para agregar todas as sequências de multi-byte em caracteres individuais quando necessário.

A Stream pode ser utilizado tanto para leitura e escrita, desde bytes são os itens de nível mais baixo usadas em operações de E / S.

Outras dicas

Eu sempre achei a melhor coisa a fazer é apenas olhar para o que os métodos que proporcionam e como você pode construí-los. Isso é quase sempre o principal, se não a única, coisa que me interessa quando se usa uma API. Como eu construí-lo e que ele pode fazer?

Você não pode instanciar um TextWriter. É abstrato. Isso me diz o único propósito real que serve é, bem, abstração. Se você escrever uma função que recebe qualquer tipo de escritor como um argumento, há uma boa chance que você deve apenas tomar TextWriter para ser mais versátil.

A StreamWriter você pode instanciar, e ele faz exatamente o que diz, escreve a fluxos. Isso significa que ele vai precisar de um fluxo para obter qualquer escrito verdadeiro feito. Depois de ter esse fluxo, porém, você pode fazer todos os tipos de coisas legais como a escrita de uma linha inteira de uma só vez, em vez de ter que lidar com caracteres individuais (ou melhor bytes), como você faria diretamente no fluxo.

Então, basicamente, você obter um fluxo para que você possa alimentá-lo para um StreamWriter (ou Reader). Se você estiver escrevendo texto, você provavelmente não quer trabalhar diretamente com um riacho, não mais do que você quer trabalhar com uma matriz de caracteres em vez de uma string.

FileStreams pode convenientemente ser instanciado diretamente do arquivo e as classes FileInfo, e no meu uso, esta é a forma como eles são geralmente instanciado. Obter um arquivo (eu gosto de usar FileInfo) e OpenWrite call (). Passá-lo para um StreamWriter (que é apenas um tipo de TextWriter) e você está no seu caminho.

Para generalizar: Quando você quiser descobrir uma classe, tente olhar em como você instancia-lo e que ele pode fazer. Isso geralmente apura-se muito.

Há uma diferença óbvia entre um "Stream" e um "escritor / Reader".

Um fluxo é uma representação nível de byte, e é realmente um conceito abstrato que pode ser implementada em uma variedade de maneiras. Por exemplo, você tem um FileStream e uma MemoryStream. Ambos esses são fluxos de bytes, mas eles são armazenados de forma diferente.

Escritores e Leitores de dar-lhe uma forma de correntes de processo, adicionar e extrair dados a partir deles.

Para que sua exemplos particulares, TextWriter é uma classe abstrata que escreve caracteres para um fluxo sequencialmente. Ele tem várias implementações (StreamWriter, StringWriter) que são úteis em diferentes contextos. Você usaria o que faz sentido no momento. Durante vários APIs No entanto, tudo o que é necessário é um TextWriter, ou algo a chamada "Write" ou "WriteLine" na. Não é uma preocupação dessas APIs se o escritor é usado para colocar as coisas em uma corda, um pouco de memória arbitrária, ou um arquivo.

O FileStream classe gerencia obter uma alça para um arquivo e abri-lo para leitura ou escrita e outras funções do sistema de arquivos. BinaryWriter escreve dados binários para um riacho e StreamWriter escreve dados de caracteres para um fluxo. Ambos podem usar um objeto FileStream para gravar dados binários ou caracteres para arquivos.

TextWriter é a classe base que herda StreamWriter partir. A TextWriter se destina a tomar um tipo e mostrar uma string usando seu método Write . implementação do método TextWriter.Write de StreamWriter escreve uma string, ou dados de caracteres, para um fluxo. BinaryWriter faz TextWriter não herdar porque ele faz dados de caracteres não gravar em um fluxo.

Stream é uma classe base abstracta que representa uma série de bytes.

  • MemoryStream é um fluxo de bytes mantidos na memória, apoiado por um Array.

  • FileStream é um fluxo de bytes em um arquivo, geralmente apoiados por um algum lugar identificador de arquivo no disco.

caracteres de texto são eles próprios compostos de bytes, e um único personagem pode haver vários bytes, dependendo da codificação. Há algumas classes padrão que lêem e texto de escrita para diferentes fontes, utilizando uma codificação específica.

TextWriter é uma classe base abstrata para escrever caracteres de texto para um destino.

  • StreamWriter escreve caracteres de texto (convertido para bytes) a um fluxo de bytes.
  • StringWriter escreve caracteres de texto para uma string (através de um StringBuilder).

TextReader é uma classe base abstrata para a leitura de caracteres de texto a partir de uma fonte.

  • StreamReader lê caracteres de texto (convertido a partir de bytes) de um fluxo de bytes.
  • StringReader lê caracteres de texto a partir de uma string.

Stream, TextWriter, TextReader são todas as classes base abstratas para que eles nunca são usados ??diretamente, mas através de uma implementação como os descritos acima. No entanto, você vai ver as classes base em definições de métodos de modo que diferentes implementações podem ser usados, incluindo seus próprios entes personalizados, se necessário. Classes abstratas são semelhantes às interfaces, mas pode realmente definir a lógica para os métodos, que podem ser reutilizados sem toda implementação repetindo o mesmo código básico.

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