C# C语言中的字符串流#
我希望能够从我创建的类中构建一个字符串,该类派生自C# C语言中的字符串流#,c#,.net,stringstream,C#,.net,Stringstream,我希望能够从我创建的类中构建一个字符串,该类派生自流。具体来说,我希望能够编写如下代码: void Print(Stream stream) { // Some code that operates on a Stream. } void Main() { StringStream stream = new StringStream(); Print(stream); string myString = stream.GetResult(); } 我可以创建一
流
。具体来说,我希望能够编写如下代码:
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
)与底层StringBuilder
一起工作,因为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()使用的编码。您有许多选项:
一种是不使用流,而是使用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
您可以使用和类的串联:
您可以从字符串创建MemoryStream,并在任何需要流的第三方函数中使用它。在本例中,MemoryStream在UTF8.GetBytes的帮助下提供了Java的StringStream的功能
从字符串示例
举例
我在这里看到了很多好的答案,但是没有一个能直接解决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);
}
}
一个使用它的例子
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());
是否考虑使用<代码> StringBuilder < /代码>?如果<代码>流<代码>不代表<代码>字符串< /代码>会发生什么?你到底想用这样的东西实现什么?你能给我们提供外部API方法的签名吗?GetBuffer()的可能副本会为我返回整个缓冲区,并带有一个零尾。ToArray()对我有效。@Fox32:请注意,ToArray()
创建了一个新数组,而AreasGetBuffer()
返回内部数组。这个答案用于从流中获取字符串。对于反向(从字符串中获取流),可以执行var stream=newmemorystream(Encoding.UTF8.GetBytes(“string”)代码>我不明白为什么这个答案被接受,因为它不能解决海报的问题。StringWriter不是流,因此不能作为流使用。@中微子OP的代码不需要使用流
-在这种情况下,这是一个更好的设计选择。我阅读了OP的语句“method Print in external dll。我需要使用流”,意思是打印要么是无法修改的外部代码,或者其他设计约束要求在其方法签名中使用流。在这种情况下,重构Print的签名并不能回答前面提到的问题,尽管这个问题可能只是措辞含糊不清writer@Isaac这直接回答了原始海报的问题。如果您试图从字符串中读取流
,则可以使用re:您也可以从文件流中获取文本编写器。是的,我明白了。我想我应该发布一个与标题相符的答案,因为这是大多数人来这里寻找的。
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
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);
}
}
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());