C#中的StringStream

And*_*hin 45 .net c# 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();
}
Run Code Online (Sandbox Code Playgroud)

我可以创建一个叫做的类StringStream吗?或者这样的课程已经可用?

更新:在我的示例中,该方法Print在第三方外部DLL中提供.如您所见,Print期望的论点是Stream.打印到之后Stream,我希望能够将其内容检索为字符串.

Lu5*_*u55 38

你可以使用串联MemoryStreamStreamReader类:

void Main()
{
    string myString;

    using (var stream = new MemoryStream())
    {
        Print(stream);

        stream.Position = 0;
        using (var reader = new StreamReader(stream))
        {
            myString = reader.ReadToEnd();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)


Hen*_*man 35

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

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


更新后:

void Main() 
{
  string myString;  // outside using

  using (MemoryStream stream = new MemoryStream ())
  {
     Print(stream);
     myString = Encoding.UTF8.GetString(stream.ToArray());
  }
  ... 

}
Run Code Online (Sandbox Code Playgroud)

您可能希望将UTF8更改为ASCII,具体取决于Print()使用的编码.

  • GetBuffer()返回整个缓冲区,尾部为零.ToArray()适合我. (2认同)

Ree*_*sey 12

您可以使用StringWriter将值写入字符串.它提供了一种类似于流的语法(虽然不是从中派生出来的Stream),它与底层函数一起使用StringBuilder.

  • 我不明白为什么这个答案被接受,因为它没有解决海报的问题.StringWriter不是Stream,因此不能用作一个. (49认同)
  • 我阅读了OP的声明"方法Print in external dll.我需要使用Stream"来表示Print是无法修改的外部代码,或者其他设计约束要求在其方法签名中使用Stream.在这种情况下,重构Print的签名并没有回答所述的问题,尽管问题可能只是含糊不清. (14认同)
  • 我来这里寻找字符串流,而不是字符串编写器 (4认同)
  • @Neutrino OP 的代码不需要*使用`Stream` - 在这种情况下,这是一个更好的设计选择。 (2认同)

AQu*_*rky 11

我在这里看到了很多好的答案,但没有一个直接解决 C# 中缺少 StringStream 类的问题。所以我自己写了一篇...

public class StringStream : Stream
{
    private readonly MemoryStream _memory;
    public StringStream(string text)
    {
        _memory = new MemoryStream(Encoding.UTF8.GetBytes(text));
    }
    public StringStream()
    {
        _memory = new MemoryStream();
    }
    public StringStream(int capacity)
    {
        _memory = new MemoryStream(capacity);
    }
    public override void Flush()
    {
        _memory.Flush();
    }
    public override int Read(byte[] buffer, int offset, int count)
    {
        return  _memory.Read(buffer, offset, count);
    }
    public override long Seek(long offset, SeekOrigin origin)
    {
        return _memory.Seek(offset, origin);
    }
    public override void SetLength(long value)
    {
        _memory.SetLength(value);
    }
    public override void Write(byte[] buffer, int offset, int count)
    {
        _memory.Write(buffer, offset, count);
    }
    public override bool CanRead => _memory.CanRead;
    public override bool CanSeek => _memory.CanSeek;
    public override bool CanWrite => _memory.CanWrite;
    public override long Length =>  _memory.Length;
    public override long Position
    {
        get => _memory.Position;
        set => _memory.Position = value;
    }
    public override string ToString()
    {
        return System.Text.Encoding.UTF8.GetString(_memory.GetBuffer(), 0, (int) _memory.Length);
    }
    public override int ReadByte()
    {
        return _memory.ReadByte();
    }
    public override void WriteByte(byte value)
    {
        _memory.WriteByte(value);
    }
}
Run Code Online (Sandbox Code Playgroud)

它的使用示例...

        string s0 =
            "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor\r\n" +
            "incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud\r\n" +
            "exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor\r\n" +
            "in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint\r\n" +
            "occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.\r\n";
        StringStream ss0 = new StringStream(s0);
        StringStream ss1 = new StringStream();
        int line = 1;
        Console.WriteLine("Contents of input stream: ");
        Console.WriteLine();
        using (StreamReader reader = new StreamReader(ss0))
        {
            using (StreamWriter writer = new StreamWriter(ss1))
            {
                while (!reader.EndOfStream)
                {
                    string s = reader.ReadLine();
                    Console.WriteLine("Line " + line++ + ": " + s);
                    writer.WriteLine(s);
                }
            }
        }

        Console.WriteLine();
        Console.WriteLine("Contents of output stream: ");
        Console.WriteLine();
        Console.Write(ss1.ToString());
Run Code Online (Sandbox Code Playgroud)


NH.*_*NH. 5

您可以从 String 创建 MemoryStream 并在需要流的任何第三方函数中使用它。在这种情况下,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);
}
Run Code Online (Sandbox Code Playgroud)

字符串示例

stream.Seek(0, SeekOrigin.Begin);
string s;
using (var readr = new StreamReader(stream))
{
    s = readr.ReadToEnd();
}
//and don't forget to dispose the stream if you created it
Run Code Online (Sandbox Code Playgroud)

  • 我想我应该发布一个与标题实际匹配的答案,因为这是大多数人来这里寻找的答案。 (2认同)