[C#] 문자열에서 스트림을 어떻게 생성합니까?

텍스트 파일에서 오는 스트림을 취하는 메소드에 대한 단위 테스트를 작성해야합니다. 나는 이런 식으로하고 싶다 :

Stream s = GenerateStreamFromString("a,b \n c,d");



답변

public static Stream GenerateStreamFromString(string s)
{
    var stream = new MemoryStream();
    var writer = new StreamWriter(stream);
    writer.Write(s);
    writer.Flush();
    stream.Position = 0;
    return stream;
}

다음을 사용하는 것을 잊지 마십시오.

using (var stream = GenerateStreamFromString("a,b \n c,d"))
{
    // ... Do stuff to stream
}

StreamWriter처분되지 않는 것에 대해 . StreamWriter기본 스트림을 감싸는 래퍼 일 뿐이므로 처리해야 할 리소스를 사용하지 않습니다. 이 Dispose메소드 는 쓰는 기본 Stream을 닫습니다 StreamWriter. 이 경우에 MemoryStream우리 는 돌아 가고자합니다.

.NET 4.5에는 이제 StreamWriter작성자가 폐기 된 후에 기본 스트림을 열어 두는 과부하 가 있지만이 코드는 동일한 기능을 수행하며 다른 버전의 .NET에서도 작동합니다.

BaseStream을 닫지 않고 StreamWriter를 닫을 수있는 방법이 있습니까?를 참조하십시오 .


답변

다른 해결책 :

public static MemoryStream GenerateStreamFromString(string value)
{
    return new MemoryStream(Encoding.UTF8.GetBytes(value ?? ""));
}


답변

이것을 정적 문자열 유틸리티 클래스에 추가하십시오.

public static Stream ToStream(this string str)
{
    MemoryStream stream = new MemoryStream();
    StreamWriter writer = new StreamWriter(stream);
    writer.Write(str);
    writer.Flush();
    stream.Position = 0;
    return stream;
}

확장 기능이 추가되어 간단하게 수행 할 수 있습니다.

using (var stringStream = "My string".ToStream())
{
    // use stringStream
}


답변

public Stream GenerateStreamFromString(string s)
{
    return new MemoryStream(Encoding.UTF8.GetBytes(s));
}


답변

MemoryStream클래스를 사용 Encoding.GetBytes하여 문자열을 먼저 바이트 배열로 변환하십시오.

나중에 TextReader스트림에 필요 합니까? 그렇다면 StringReader직접 제공 하고 MemoryStreamEncoding단계를 무시할 수 있습니다.


답변

나는 다음과 같은 답변을 혼합하여 사용했습니다.

public static Stream ToStream(this string str, Encoding enc = null)
{
    enc = enc ?? Encoding.UTF8;
    return new MemoryStream(enc.GetBytes(str ?? ""));
}

그리고 나는 이것을 다음과 같이 사용합니다 :

String someStr="This is a Test";
Encoding enc = getEncodingFromSomeWhere();
using (Stream stream = someStr.ToStream(enc))
{
    // Do something with the stream....
}


답변

아래에 나열된 확장 방법을 사용합니다. 개발자가 인코딩에 대한 결정을 내릴 수 있도록해야하므로 마술이 적습니다.

public static class StringExtensions {

    public static Stream ToStream(this string s) {
        return s.ToStream(Encoding.UTF8);
    }

    public static Stream ToStream(this string s, Encoding encoding) {
        return new MemoryStream(encoding.GetBytes(s ?? ""));
    }
}