ИО 101:Каковы основные различия между TextWriter, FileStream и StreamWriter?
Вопрос
Позвольте мне сначала извиниться, если этот вопрос может показаться дилетантским для опытных программистов среди вас, дело в том, что у меня было много споров по этому поводу на работе, поэтому я действительно хочу прояснить это, и именно поэтому я полагаюсь в сообществе 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
Все они являются абстрактными базовыми классами, поэтому они никогда не используются напрямую, а через реализацию, подобную описанной выше.Однако вы увидите базовые классы в определениях методов, чтобы можно было использовать различные реализации, в том числе, при необходимости, свои собственные.Абстрактные классы похожи на интерфейсы, но фактически могут определять логику методов, которые можно использовать повторно, при этом каждая реализация не повторяет один и тот же базовый код.