Подтвердить что ты не робот

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

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

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

Класс TextWriter

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

Класс FileStream

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

Класс StreamWriter

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

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

Любые комментарии были бы более чем оценены, спасибо заблаговременно!

4b9b3361

Ответ 1

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

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

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

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

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

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

Ответ 2

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

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

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

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

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

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

Ответ 3

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

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

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

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

Ответ 4

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

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