C#에서 StringStream 만들기

Syed Hassan Sabeeh Kazmi 2023년10월12일
  1. MemoryStreamStreamReader 클래스의 탠덤을 사용하여 C#에서 StringStream 생성
  2. C#에서 StringStream 클래스 생성
C#에서 StringStream 만들기

C#에서 StringStreamStringBuilder의 도움으로 Stream에서 파생됩니다. 기본 목적은 현재 문자열로만 저장된 데이터를 수락하고 메서드에 전달하는 것입니다.

이 자습서에서는 C#에서 StringStream을 생성하는 여러 접근 방식을 배웁니다. MemoryStream에서 StringStream을 파생시키는 가장 쉬운 방법은 Stream에 포함된 데이터의 바이트 배열을 허용하는 생성자를 활용하는 것입니다.

MemoryStreamStreamReader 클래스의 탠덤을 사용하여 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#의 입력 및 출력 유형에 대한 일반 인터페이스를 제공합니다. MemoryStreamStreamReader 클래스의 도움으로 개발자는 기본 장치 및 OS의 특정 세부 정보로부터 자신을 격리할 수 있습니다.

따라서 StringStreamStream을 복잡하게 만들지 않고 데이터를 수신, 처리 및 전송하여 장치 간에 통신하는 데 필수적입니다.

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