StringStream in C# erstellen

Syed Hassan Sabeeh Kazmi 12 Oktober 2023
  1. Verwenden Sie das Tandem der Klassen MemoryStream und StreamReader, um StringStream in C# zu erstellen
  2. Erstellen Sie eine StringStream-Klasse in C#
StringStream in C# erstellen

In C# wird StringStream mit Hilfe von StringBuilder von Stream abgeleitet. Ihr Hauptzweck besteht darin, die derzeit gespeicherten Daten nur als Zeichenfolge zu akzeptieren und an eine Methode weiterzugeben.

In diesem Tutorial lernen Sie mehrere Ansätze zum Erstellen von StringStream in C# kennen. Der einfachste Weg, einen StringStream von MemoryStream abzuleiten, besteht darin, seinen Konstruktor zu nutzen, der das im Stream enthaltene Byte-Array von Daten akzeptiert.

Verwenden Sie das Tandem der Klassen MemoryStream und StreamReader, um StringStream in C# zu erstellen

Verwenden Sie StreamReader, um Zeichen zu lesen, die in einer bestimmten Codierung gestreamt werden sollen, und wird von TextReader geerbt, der Methoden zum Lesen von Zeichen aus dem Eingabestrom bereitstellt. System.IO.Stream stellt als abstrakte Klasse Methoden bereit, um Bytes an die Quelle zu übertragen.

Der MemoryStream erbt die Stream-Klasse und bietet die Funktionalität zum Lesen und Schreiben von Daten (in Bytes) aus einer bestimmten Quelle. Es spielt eine entscheidende Rolle bei der Erstellung von StringStream in 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();
        }
      }
    }
  }
}

In StringStream erfordert die Übergabe von Daten von der Quelle an den MemoryStream-Konstruktor, dass Daten ein MemoryStream-Objekt sind. Verwenden Sie die Methode GetBytes Encoding, um ein Byte-Array zu erstellen.

Erstellen Sie ein StreamReader-Objekt, um ein Stream-Objekt in einen C#-String zu konvertieren, und rufen Sie die ReadToEnd-Methode auf.

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

Erstellen Sie eine StringStream-Klasse in C#

Im Gegensatz zu Java hat C# keine vorgefertigte StringStream-Klasse. Es ist einfach, mit MemoryStream und StreamBuilder ein StringStream-Klassenobjekt zu erstellen, um den Zweck zu erfüllen.

Sie können jedoch mit Hilfe des folgenden C#-Codes eine Klasse StringStram erstellen.

// 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 bietet eine generische Schnittstelle zu den Eingabe- und Ausgabetypen in C#. Mithilfe der Klassen MemoryStream und StreamReader können sich Entwickler von den spezifischen Details der zugrunde liegenden Geräte und Betriebssysteme isolieren.

Daher ist StringStream von entscheidender Bedeutung für die Kommunikation zwischen Geräten durch Empfangen, Verarbeiten und Übertragen von Daten, ohne den Stream zu verkomplizieren.

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