C#中的StringStream

我希望能够从我从Stream创build的类创build一个string。 具体来说,我想能够写这样的代码:

 void Print(Stream stream) { // Some code that operates on a Stream. } void Main() { StringStream stream = new StringStream(); Print(stream); string myString = stream.GetResult(); } 

我可以创build一个名为StringStream的类吗? 还是已经有这样的课程了?

更新:在我的示例中, Print方法在第三方外部DLL中提供。 正如你所看到的, Print期望的是一个Stream 。 打印到Stream ,我希望能够以string的forms检索它的内容。

您可以使用MemoryStreamStreamReader类的串联:

 void Main() { string myString; using (var stream = new MemoryStream()) { Print(stream); stream.Position = 0; using (var reader = new StreamReader(stream)) { myString = reader.ReadToEnd(); } } } 

由于您的Print()方法可能会处理文本数据,您是否可以重写它以接受TextWriter参数?

该库提供了一个StringWriter: TextWriter而不是一个StringStream。 我想你可以通过包装一个MemoryStream创build一个,但是真的有必要吗?


更新后:

 void Main() { string myString; // outside using using (MemoryStream stream = new MemoryStream ()) { Print(stream); myString = Encoding.UTF8.GetString(stream.ToArray()); } ... } 

您可能需要将UTF8更改为ASCII,具体取决于Print()所使用的编码。

您可以使用StringWriter将值写入string。 它提供了一个类似于stream的语法(尽pipe不是从Stream派生的),它与底层的StringBuilder

你有很多select:

一个是不使用stream,但使用TextWriter

  void Print(TextWriter writer) { } void Main() { var textWriter = new StringWriter(); Print(writer); string myString = textWriter.ToString(); } 

TextWriter很可能是您的printfunction的适当抽象级别。 Streams旨在编写二进制数据,而TextWriter工作在更高的抽象层次,特别适用于输出string。

如果你的动机是你也希望你的Printfunction写入文件,你也可以从文件stream中获得一个文本编写器。

 void Print(TextWriter writer) { } void PrintToFile(string filePath) { using(var textWriter = new StreamWriter(filePath)) { Print(writer); } } 

如果你真的想要一个stream,你可以看看MemoryStream

您可以从String创build一个MemoryStream,并在需要stream的任何第三方函数中使用它。 在这种情况下,MemoryStream在UTF8.GetBytes的帮助下,提供了Java的StringStreamfunction。

来自String的例子

 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); } 

以string为例

 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