StringStream в С#
Я хочу, чтобы иметь возможность построить строку из класса, который я создаю, происходит от Stream
. В частности, я хочу иметь возможность писать код следующим образом:
void Print(Stream stream) {
// Some code that operates on a Stream.
}
void Main() {
StringStream stream = new StringStream();
Print(stream);
string myString = stream.GetResult();
}
Могу ли я создать класс с именем StringStream
, который сделает это возможным? Или такой класс уже доступен?
Обновление: В моем примере метод Print
предоставляется в сторонней внешней DLL. Как вы можете видеть, аргумент Print
ожидает Stream
. После печати на Stream
я хочу получить его содержимое в виде строки.
Ответы
Ответ 1
Вы можете использовать тандемы MemoryStream
и StreamReader
:
void Main()
{
string myString;
using (var stream = new MemoryStream())
{
Print(stream);
stream.Position = 0;
using (var reader = new StreamReader(stream))
{
myString = reader.ReadToEnd();
}
}
}
Ответ 2
Поскольку ваш метод Print(), по-видимому, имеет дело с текстовыми данными, вы могли бы переписать его, чтобы принять параметр TextWriter
?
Библиотека предоставляет StringWriter: TextWriter
, но не StringStream. Я полагаю, вы могли бы создать один, обернув MemoryStream, но действительно ли это необходимо?
После обновления:
void Main()
{
string myString; // outside using
using (MemoryStream stream = new MemoryStream ())
{
Print(stream);
myString = Encoding.UTF8.GetString(stream.ToArray());
}
...
}
Вы можете изменить UTF8 на ASCII, в зависимости от кодировки, используемой Print().
Ответ 3
Вы можете использовать StringWriter для записи значений в строку. Он предоставляет потоковый синтаксис (хотя он и не вытекает из Stream
), который работает с базовым StringBuilder
.
Ответ 4
У вас есть несколько вариантов:
Один из них - не использовать потоки, но использовать TextWriter
void Print(TextWriter writer)
{
}
void Main()
{
var textWriter = new StringWriter();
Print(writer);
string myString = textWriter.ToString();
}
Вероятно, что TextWriter
является подходящим уровнем абстракции для вашей функции print
.
Потоки нацелены на запись двоичных данных, в то время как TextWriter работает с более высоким уровнем абстракции, специально предназначенным для вывода строк.
Если ваша мотивация заключается в том, что вы также хотите, чтобы ваша функция print
записывалась в файлы, вы также можете получить текстовый редактор из потока.
void Print(TextWriter writer)
{
}
void PrintToFile(string filePath)
{
using(var textWriter = new StreamWriter(filePath))
{
Print(writer);
}
}
Если вы действительно хотите поток, вы можете посмотреть MemoryStream
.
Ответ 5
Вы можете создать MemoryStream из String и использовать его в любой сторонней функции, для которой требуется поток. В этом случае MemoryStream с помощью UTF8.GetBytes обеспечивает функциональность Java StringStream.
Из примеров строк
String content = "stuff";
using (MemoryStream stream = new MemoryStream(System.Text.Encoding.UTF8.GetBytes(content)))
{
Print(stream); //or whatever action you need to perform with the stream
stream.Seek(0, SeekOrigin.Begin); //If you need to use the same stream again, don't forget to reset it.
UseAgain(stream);
}
Пример строки
stream.Seek(0, SeekOrigin.Begin);
using (var readr = new StreamReader(stream))
{
UseAsString(readr.ReadToEnd());
}
//and don't forget to dispose the stream if you created it