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

c# .net-3.5 io .net

23813 просмотра

5 ответа

2698 Репутация автора

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

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

Класс TextWriter

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

Класс FileStream

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

Класс StreamWriter

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

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

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

Автор: Nano Taboada Источник Размещён: 18.06.2009 02:57

Ответы (5)


60 плюса

21219 Репутация автора

Решение

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

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

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

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

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

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

Автор: lavinio Размещён: 18.06.2009 02:58

4 плюса

20133 Репутация автора

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

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

Автор: scottm Размещён: 18.06.2009 03:12

6 плюса

10303 Репутация автора

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

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

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

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

Автор: Nader Shirazie Размещён: 18.06.2009 03:12

10 плюса

5795 Репутация автора

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

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

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

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

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

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

Автор: Instance Hunter Размещён: 18.06.2009 03:15

2 плюса

4027 Репутация автора

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

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

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

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

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

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

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

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

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

Автор: Mani Gandham Размещён: 14.06.2018 08:26
32x32