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

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 я хочу получить его содержимое в виде строки.

4b9b3361

Ответ 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