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
你可以使用串联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();
}
}
}
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()使用的编码.
Ree*_*sey 12
您可以使用StringWriter将值写入字符串.它提供了一种类似于流的语法(虽然不是从中派生出来的Stream),它与底层函数一起使用StringBuilder.
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)
您可以从 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)
| 归档时间: |
|
| 查看次数: |
96351 次 |
| 最近记录: |