Мне нужно написать модульный тест для метода, который принимает поток из текстового файла. Я хотел бы сделать что-то вроде этого:
Stream s = GenerateStreamFromString("a,b \n c,d");
Мне нужно написать модульный тест для метода, который принимает поток из текстового файла. Я хотел бы сделать что-то вроде этого:
Stream s = GenerateStreamFromString("a,b \n c,d");
StringReaderStream
В stackoverflow.com/a/55170901/254109Ответы:
Не забудьте использовать Using:
О
StreamWriter
не распоряжаться.StreamWriter
это просто оболочка для основного потока, и она не использует ресурсы, которые должны быть удалены.Dispose
Метод будет закрыть , лежащий в основе ,Stream
которыйStreamWriter
выполняет запись. В этом случае этоMemoryStream
мы и хотим вернуть.В .NET 4.5 теперь есть перегрузка, благодаря
StreamWriter
которой основной поток остается открытым после удаления средства записи, но этот код делает то же самое и работает с другими версиями .NET.См. Есть ли способ закрыть StreamWriter, не закрывая его BaseStream?
источник
GenerateStreamFromString
методе вы не используете Use with StreamWriter. Есть причина для этого?StreamWriter
в любом случае, вероятно, делает то, что вы сказали внутри. Преимущество - инкапсуляция и более простой код, но за счет абстрагирования от таких вещей, как кодирование. Это зависит от того, чего вы пытаетесь достичь.Другое решение:
источник
new MemoryStream(Encoding.UTF8.GetBytes("\ufeff" + (value ?? ""))
если вам нужно включить спецификацию в начале потокаnew MemoryStream( value, false )
, Вы не можете сделать поток доступным только для чтения, если вам нужно записать его с помощью средства записи потока.Добавьте это в служебный класс статической строки:
Это добавляет функцию расширения, чтобы вы могли просто:
источник
StreamWriter
. Исправление состояло в том, чтобы использовать другой конструктор - тот, который позволял мне указывать оставлять открытыми .источник
Используйте
MemoryStream
класс, вызывая,Encoding.GetBytes
чтобы сначала превратить вашу строку в массив байтов.Нужно ли вам впоследствии
TextReader
в потоке? Если это так, вы можете поставитьStringReader
напрямую, и обойтиMemoryStream
иEncoding
шаги.источник
Я использовал смесь ответов, как это:
И тогда я использую это так:
источник
Мы используем методы расширения, перечисленные ниже. Я думаю, что вы должны сделать так, чтобы разработчик принял решение о кодировке, чтобы не было никакой магии.
источник
return ToStream(s, Encoding.UTF8);
. В текущей реализации (return s.ToStream(Encoding.UTF8);
разработчик вынужден думать сложнее, чтобы понять код, и кажется, что случайs == null
не обрабатывается и выбрасываетNullReferenceException
.Ну вот:
источник
Модернизированная и слегка модифицированная версия методов расширения для
ToStream
:Модификация, предложенная в комментарии @ Palec к ответу @Shaun Bowe.
источник
Я думаю, что вы можете извлечь выгоду из использования MemoryStream . Вы можете заполнить его строковыми байтами, полученными с помощью метода GetBytes класса Encoding .
источник
Если вам нужно изменить кодировку, я голосую за решение @ShaunBowe . Но каждый ответ здесь копирует всю строку в памяти хотя бы один раз. Ответы с
ToCharArray
+BlockCopy
комбо делают это дважды.Если это имеет значение, это простая
Stream
оболочка для необработанной строки UTF-16. Если используется сStreamReader
выборомEncoding.Unicode
для него:А вот более полное решение с необходимыми проверками привязки (полученными из
MemoryStream
таковыхToArray
иWriteTo
методов).источник
Хорошая комбинация расширений String:
источник