ИО 101:Каковы основные различия между TextWriter, FileStream и StreamWriter?

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

  •  06-07-2019
  •  | 
  •  

Вопрос

Позвольте мне сначала извиниться, если этот вопрос может показаться дилетантским для опытных программистов среди вас, дело в том, что у меня было много споров по этому поводу на работе, поэтому я действительно хочу прояснить это, и именно поэтому я полагаюсь в сообществе stackoverflow, чтобы решить эту проблему раз и навсегда :)

Итак, с одной стороны по MSDN имеем:

Класс TextWriter

Представляет автора, который может написать последовательная последовательность символов.Этот Класс является абстрактным.

Класс FileStream

Предоставляет Stream вокруг файла, Поддержка как синхронных, так и Асинхронное чтение и запись операционный.

Класс StreamWriter

Реализует текстогворайтер для написания символов в поток в определенном кодировании.

С другой стороны, очевидно, что все они принадлежат System.IO, но, учитывая, что примеры MSDN как бы смешивают некоторые из них, я все еще не достиг столь желанного момента ага.

Любой комментарий будет более чем признателен, заранее спасибо!

Это было полезно?

Решение

Потоки обрабатывают байты , Writers обрабатывает символы .

Байт! = символы. Символ может занять более одного байта для представления. Отображение символов в байты называется кодировкой .

FileStream ссылается на байты, записываемые в файл, подобно тому, как MemoryStream ссылается на байты, записанные в буфер в памяти. Чтобы записывать символы в поток, вам необходимо преобразовать их в строку байтов. Вот тут и вступает в игру StreamWriter . Он принимает последовательность символов и кодировку и превращает ее в последовательность байтов.

TextWriter - это интерфейс (ну, абстрактный базовый класс), которого должны придерживаться все авторы. Все операции основаны на символах. Эквивалентом байтов является абстрактный базовый класс Stream .

Вещи также идут в противоположном направлении. Существует абстрактный базовый класс TextReader , описывающий, как читать символы откуда-то, и StreamReader , который позволяет читать символы из байтового потока, предоставляющего кодировку - но это время используется в обратном порядке для объединения любых многобайтовых последовательностей в отдельные символы, где это необходимо.

Stream может использоваться как для чтения, так и для записи, поскольку байты являются элементами самого низкого уровня, используемыми в операциях ввода / вывода.

Другие советы

Я всегда находил лучшее, что можно сделать, это просто посмотреть, какие методы они предоставляют и как их можно построить. Это почти всегда главное, если не единственное, что меня волнует при использовании API. Как мне его построить и что он может сделать?

Вы не можете создать экземпляр TextWriter. Это абстрактно. Это говорит мне, что единственная реальная цель, которой он служит, это, ну, абстракция. Если вы пишете функцию, которая принимает в качестве аргумента любой писатель, есть большая вероятность, что вы просто должны использовать TextWriter для большей универсальности.

StreamWriter, который вы можете создать, и он делает только то, что говорит, он записывает в потоки. Это означает, что для выполнения любой реальной записи потребуется поток. Если у вас есть этот поток, вы можете делать все изящные вещи, например, писать целую строку за раз, вместо того, чтобы иметь дело с отдельными символами (или, скорее, байтами), как если бы вы были непосредственно в потоке.

Таким образом, вы получаете поток и можете передавать его в StreamWriter (или Reader). Если вы пишете текст, вы, вероятно, не хотите работать непосредственно с потоком, не больше, чем вы хотите работать с массивом символов вместо строки.

FileStreams удобно создавать непосредственно из классов File и FileInfo, и в моем случае именно так они обычно создаются. Получить файл (мне нравится использовать FileInfo) и вызвать OpenWrite (). Передайте его StreamWriter (это просто тип TextWriter), и вы уже в пути.

Обобщение: если вы хотите выяснить класс, попробуйте посмотреть, как вы его создаете и на что он способен. Это обычно многое проясняет.

Существует очевидная разница между " потоком " и " Writer / Reader ".

Поток - это представление уровня байтов, и это действительно абстрактная концепция, которая может быть реализована различными способами. Например, у вас есть FileStream и MemoryStream. Оба эти потока байтов, но они хранятся по-разному.

Писатели и читатели дают вам возможность обрабатывать потоки, добавлять и извлекать из них данные.

Для ваших конкретных примеров TextWriter - это абстрактный класс, который последовательно записывает символы в поток. Он имеет несколько реализаций (StreamWriter, StringWriter), которые полезны в разных контекстах. Вы бы использовали то, что имеет смысл в то время. Однако для нескольких API все, что нужно, это TextWriter или что-то, что можно вызвать как «Написать». или " WriteLine " на. Эти API не имеют значения, если ваш писатель используется для помещения материала в строку, произвольную память или файл.

класс FileStream управляет получением дескриптора к файлу и открывая его для чтения или записи и других функций файловой системы. BinaryWriter записывает двоичные данные в поток и StreamWriter записывает символьные данные в поток. Они оба могут использовать объект FileStream для записи двоичных или символьных данных в файлы.

TextWriter - это базовый класс, от которого наследуется StreamWriter. TextWriter предназначен для использования типа и выведите строку, используя метод записи , Реализация метода TextWriter.Write в StreamWriter записывает строку или символьные данные в поток. BinaryWriter не наследует TextWriter, поскольку не записывает символьные данные в поток.

Stream — абстрактный базовый класс, представляющий последовательность байтов.

  • MemoryStream представляет собой поток байтов, хранящийся в памяти и поддерживаемый массивом.

  • FileStream — это поток байтов в файле, обычно поддерживаемый дескриптором файла где-то на диске.

Текстовые символы сами состоят из байтов, и один символ может состоять из нескольких байтов, в зависимости от кодировки.Существует несколько стандартных классов, которые читают и записывают текст в разные источники, используя определенную кодировку.

TextWriter — абстрактный базовый класс для записи текстовых символов в пункт назначения.

  • StreamWriter записывает текстовые символы (преобразованные в байты) в поток байтов.
  • StringWriter записывает текстовые символы в строку (через StringBuilder).

TextReader — абстрактный базовый класс для чтения текстовых символов из источника.

  • StreamReader читает текстовые символы (преобразованные из байтов) из потока байтов.
  • StringReader читает текстовые символы из строки.

Stream, TextWriter, TextReader Все они являются абстрактными базовыми классами, поэтому они никогда не используются напрямую, а через реализацию, подобную описанной выше.Однако вы увидите базовые классы в определениях методов, чтобы можно было использовать различные реализации, в том числе, при необходимости, свои собственные.Абстрактные классы похожи на интерфейсы, но фактически могут определять логику методов, которые можно использовать повторно, при этом каждая реализация не повторяет один и тот же базовый код.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top