C# で StringStream を作成する

Syed Hassan Sabeeh Kazmi 2023年10月12日
  1. MemoryStream クラスと StreamReader クラスのタンデムを使用して C#StringStream を作成する
  2. C#StringStream クラスを作成する
C# で StringStream を作成する

C# では、StringStreamStringBuilder の助けを借りて Stream から派生します。 その主な目的は、現在文字列としてのみ保存されているデータを受け入れてメソッドに渡すことです。

このチュートリアルでは、C# で StringStream を作成するための複数のアプローチを学習します。 MemoryStream から StringStream を派生させる最も簡単な方法は、Stream に含まれるデータのバイト配列を受け入れるコンストラクターを利用することです。

MemoryStream クラスと StreamReader クラスのタンデムを使用して C#StringStream を作成する

StreamReader を使用して、指定されたエンコーディングでストリーミングする文字を読み取ります。これは、入力ストリームから文字を読み取るメソッドを提供する TextReader から継承されます。 System.IO.Stream は抽象クラスとして、ソースにバイトを転送するメソッドを提供します。

MemoryStreamStream クラスを継承し、特定のソースからデータ (バイト単位) を読み書きする機能を提供します。 これは、C# で StringStream を作成する際に重要な役割を果たします。

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

StringStream では、ソースから MemoryStream コンストラクターにデータを渡すには、データが MemoryStream オブジェクトである必要があります。 GetBytes Encoding メソッドを使用して、バイト配列を作成します。

StreamReader オブジェクトを作成して Stream オブジェクトを C# 文字列に変換し、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();
    }
  }
}

C#StringStream クラスを作成する

Java とは異なり、C# にはビルド前の StringStream クラスがありません。 MemoryStreamStreamBuilder を使用して目的を達成するために StringStream クラス オブジェクトを作成するのは簡単です。

ただし、次の C# コードを使用して StringStram クラスを作成できます。

// 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は、C# の入力型と出力型への汎用インターフェイスを提供します。 MemoryStreamおよびStreamReaderクラスの助けを借りて、開発者は、基盤となるデバイスおよび OS の特定の詳細から自分自身を切り離すことができます。

したがって、StringStream は、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