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检索它的内容。
您可以使用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(); } } }
由于您的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
很可能是您的print
function的适当抽象级别。 Streams旨在编写二进制数据,而TextWriter工作在更高的抽象层次,特别适用于输出string。
如果你的动机是你也希望你的Print
function写入文件,你也可以从文件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