convert array c# .net stringstream

array - string to stream c#



StringStream en C# (6)

Dado que su método Print () presumiblemente trata con datos de texto, ¿podría volver a escribirlos para aceptar un parámetro TextWriter ?

La biblioteca proporciona un StringWriter: TextWriter pero no un StringStream. Supongo que podría crear uno envolviendo un MemoryStream, pero ¿es realmente necesario?

Después de la actualización:

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

Es posible que desee cambiar de UTF8 a ASCII, dependiendo de la codificación utilizada por Imprimir ().

Quiero poder construir una cadena de una clase que creo que se deriva de Stream . Específicamente, quiero poder escribir código como este:

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

¿Puedo crear una clase llamada StringStream que haga esto posible? ¿O tal clase ya está disponible?

Actualización: en mi ejemplo, el método Print se proporciona en una DLL externa de terceros. Como puede ver, el argumento que espera Print es una Stream . Después de imprimir en el Stream , quiero poder recuperar su contenido como una cadena.


Puede crear un MemoryStream desde una cadena y usarlo en cualquier función de terceros que requiera una transmisión. En este caso, MemoryStream, con la ayuda de UTF8.GetBytes, proporciona la funcionalidad de StringStream de Java.

De ejemplos de cuerdas

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

A cadena ejemplo

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


Puede usar el tándem de las clases MemoryStream y StreamReader :

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


Puede utilizar un StringWriter para escribir valores en una cadena. Proporciona una sintaxis similar a la secuencia (aunque no deriva de la Stream ) que funciona con un StringBuilder subyacente.


Tienes un número de opciones:

Una es no usar secuencias, pero usar TextWriter

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

Es probable que TextWriter sea ​​el nivel de abstracción adecuado para su función de print . Las secuencias están destinadas a escribir datos binarios, mientras que TextWriter funciona en un nivel de abstracción más alto, específicamente orientado a generar cadenas.

Si su motivación es que también desea que su función de Print escriba en archivos, también puede obtener un escritor de texto de un flujo de archivos.

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

Si REALMENTE desea una transmisión, puede consultar MemoryStream .


Veo muchas respuestas buenas aquí, pero ninguna que aborde directamente la falta de una clase StringStream en C #. Así que he escrito uno de los míos ...

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

Un ejemplo de su uso ...

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