Crear StringStream en C#

Syed Hassan Sabeeh Kazmi 12 octubre 2023
  1. Utilice el tándem de las clases MemoryStream y StreamReader para crear StringStream en C#
  2. Crear una clase StringStream en C#
Crear StringStream en C#

En C#, StringStream se deriva de Stream con la ayuda de StringBuilder. Su propósito principal es aceptar y pasar los datos actualmente almacenados solo como una cadena a un método.

En este tutorial, aprenderá varios enfoques para crear StringStream en C#. La forma más sencilla de derivar un StringStream de MemoryStream es aprovechar su constructor que acepta la matriz de bytes de datos contenidos en el Stream.

Utilice el tándem de las clases MemoryStream y StreamReader para crear StringStream en C#

Use StreamReader para leer caracteres para transmitir en una codificación específica, y se hereda de TextReader que proporciona métodos para leer caracteres del flujo de entrada. System.IO.Stream como clase abstracta proporciona métodos para transferir bytes a la fuente.

El MemoryStream hereda la clase Stream y proporciona la funcionalidad para leer y escribir datos (en bytes) de una fuente en particular. Desempeña un papel crucial en la creación de StringStream en C#.

// add `System.IO` library to your C# project
using System;
using System.IO;
using System.Text;

namespace createStringStream {
  class StreamClass {
    static void Main(string[] args) {
      // creation of StringStream object for communication or data transfer
      string StringStream;

      using (var objStream = new MemoryStream()) {
        Console.WriteLine(objStream);

        // initial postition of the `MemoryStream` object
        objStream.Position = 0;
        using (var reader = new StreamReader(objStream)) {
          // StringStream creation and initialization
          StringStream = reader.ReadToEnd();
        }
      }
    }
  }
}

En StringStream, pasar datos de la fuente al constructor MemoryStream requiere que los datos sean un objeto MemoryStream. Utilice el método GetBytes Encoding para crear una matriz de bytes.

Cree un objeto StreamReader para convertir un objeto Stream en una cadena C# y llame al método ReadToEnd.

// add `System.IO` before executing the C# code
using System;
using System.IO;
using System.Text;

namespace convertVar {
  class StringtoStream {
    static void Main(string[] args) {
      // declare a string variable
      string test = "Experiment values: 3.1437";

      // for converting string to stream
      byte[] byteArray = Encoding.ASCII.GetBytes(test);
      MemoryStream stream = new MemoryStream(byteArray);

      // for converting stream to string
      StreamReader reader = new StreamReader(stream);
      string text = reader.ReadToEnd();

      // output
      Console.WriteLine(text);
      Console.ReadLine();
    }
  }
}

Crear una clase StringStream en C#

A diferencia de Java, C# no tiene una clase StringStream preconstruida. Es fácil hacer un objeto de clase StringStream para cumplir el propósito utilizando MemoryStream y StreamBuilder.

Sin embargo, puede crear una clase StringStram con la ayuda del siguiente código C#.

// add `System.IO` referance to your C# project to create `StringStream` class
using System;
using System.Text;
using System.Windows.Forms;
using System.IO;

namespace userStringStream {
  public partial class Form1 : Form {
    public Form1() {
      InitializeComponent();
    }

    // a click even for `Create StringStream` button
    private void button2_Click(object sender, EventArgs e) {
      string s0 =
          "It's an example data the `s0` string contains. Ur fndf, isnd sdnin.\r\n" +
          "Ientif nt ieuth nnsh riwnw htune iw o nwinundhsi a xmunc, dusn ainde efn. Dncisdns asnw eunc  usn sdu s n xcuxc sd c.\r\n";

      // create `StringStream` class objects to access its functionality and methods
      StringStream ss0 = new StringStream(s0);
      StringStream ss1 = new StringStream();

      int line = 1;
      Console.WriteLine("Contents of input stream: \n");

      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: \n");
      Console.Write(ss1.ToString());
    }
  }

  // the creation of `StringStream` class
  public class StringStream : Stream {
    // create `memoryStream` object for data assigning through `MemoryStream`
    private readonly MemoryStream memoryStream;

    // In genral, `memoryStream` is named as `_memory` similar to Java
    public StringStream(string text) {
      memoryStream = new MemoryStream(Encoding.UTF8.GetBytes(text));
    }
    public StringStream() {
      memoryStream = new MemoryStream();
    }
    public StringStream(int capacity) {
      memoryStream = new MemoryStream(capacity);
    }
    public override void Flush() {
      memoryStream.Flush();
    }
    public override int Read(byte[] buffer, int offset, int count) {
      return memoryStream.Read(buffer, offset, count);
    }
    public override long Seek(long offset, SeekOrigin origin) {
      return memoryStream.Seek(offset, origin);
    }
    public override void SetLength(long value) {
      memoryStream.SetLength(value);
    }
    public override void Write(byte[] buffer, int offset, int count) {
      memoryStream.Write(buffer, offset, count);
    }
    public override bool CanRead => memoryStream.CanRead;
    public override bool CanSeek => memoryStream.CanSeek;
    public override bool CanWrite => memoryStream.CanWrite;
    public override long Length => memoryStream.Length;
    public override long Position {
      get => memoryStream.Position;
      set => memoryStream.Position = value;
    }
    public override string ToString() {
      return System.Text.Encoding.UTF8.GetString(memoryStream.GetBuffer(), 0,
                                                 (int)memoryStream.Length);
    }
    public override int ReadByte() {
      return memoryStream.ReadByte();
    }
    public override void WriteByte(byte value) {
      memoryStream.WriteByte(value);
    }
  }
}

Stream proporciona una interfaz genérica para los tipos de entrada y salida en C#. Con la ayuda de las clases MemoryStream y StreamReader, los desarrolladores pueden aislarse de los detalles específicos de los dispositivos y sistemas operativos subyacentes.

Por lo tanto, StringStream es vital para la comunicación entre dispositivos al recibir, procesar y transmitir datos sin complicar el Stream.

Syed Hassan Sabeeh Kazmi avatar Syed Hassan Sabeeh Kazmi avatar

Hassan is a Software Engineer with a well-developed set of programming skills. He uses his knowledge and writing capabilities to produce interesting-to-read technical articles.

GitHub