FileStream против / различия StreamWriter?

85

Вопрос:

В чем разница между FileStreamи StreamWriterв .Net ?

В каком контексте вы должны это использовать? В чем их преимущество и недостаток?

Можно ли объединить эти два в одно?

Что происходит
источник

Ответы:

98

В чем разница между FileStream и StreamWriter в dotnet?

А FileStream- это Stream. Как и все потоки, он работает только с byte[]данными.

A StreamWriter : TextWriter, это Stream-декоратор. TextWriter кодирует текстовые данные, такие как строка или символ, byte[]а затем записывает их в связанный Stream.

В каком контексте вы должны это использовать? В чем их преимущество и недостаток?

Когда у вас есть byte[]данные, вы используете чистый FileStream . Вы добавляете, StreamWriterкогда хотите написать текст. Используйте Formatter или Serializer для записи более сложных данных.

Можно ли объединить эти два в одно?

Да. Для создания StreamWriter всегда нужен Stream. Вспомогательный метод System.IO.File.CreateText("path")создаст их в комбинации, и тогда вам останется только Dispose () внешнего писателя.

Хенк Холтерман
источник
4
Также важно отметить, что FileStreamэто тип потока, который специально предназначен для файлов. Потоки изначально работают с байтами, однако StreamWriter/ Reader будет писать / читать текст в любом потоке, а не только в FileStreams. Так , например, MemoryStreams, NetworkStreamsи т.д ..
iliketocode
19

FileStream записывает байты, StreamWriter записывает текст. Вот и все.

Ганс Пассан
источник
14
Собственно, это еще не «все» ... Но это одно правильное отличие.
Дэвид
14

FileStream явно предназначен для рабочих файлов.

StreamWriter можно использовать для потоковой передачи в любой тип Stream - сетевые сокеты, файлы и т. Д.

ScottGu довольно хорошо объясняет различные объекты Stream здесь: http://www.codeguru.com/Csharp/Csharp/cs_data/streaming/article.php/c4223

Дэвид
источник
1
Отличный справочник по потокам, хотя он не охватывает потоки R / W с произвольным доступом. Особенно полезны информация о сериализации / десериализации и демонстрация нефайловых потоков. +1
ThunderGr 05
7

Ну, из MSDN для FileStream:

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

и MSDN для StreamWriter:

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

Наиболее очевидное отличие состоит в том, что FileStreamразрешены операции чтения / записи, тогда StreamWriterкак только запись.

На StreamWriterстранице добавляются:

StreamWriter предназначен для вывода символов в определенной кодировке, тогда как классы, производные от Stream, предназначены для ввода и вывода байтов.

Второе отличие - FileStreamдля байтов, а StreamWriterдля текста.

ChrisF
источник
6

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

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

A StreamWriter- это оболочка для Stream, которая упрощает использование этого потока для вывода простого текста. Он предоставляет методы, которые принимают строки вместо байтов, и выполняет необходимые преобразования в массивы байтов и обратно. Есть и другие писатели; другой основной вариант XmlTextWriter, который вы бы использовали, - это упрощающий запись данных в формате XML . Существуют также аналоги Reader для Writers, которые аналогичным образом обертывают поток и облегчают получение данных обратно.

KeithS
источник
0

Одним из ключевых отличий (в дополнение к приведенным выше комментариям) может быть то, что FileStream поддерживает произвольное чтение и запись доступа к диску в любой указанный FileStream.Position. Для больших модификаций файлов это может быть бесценным.

beanmf
источник