1011 Stimmen

Wie erzeuge ich einen Stream aus einer Zeichenkette?

Ich muss einen Unit-Test für eine Methode schreiben, die einen Stream nimmt, der aus einer Textdatei stammt. Ich möchte so etwas wie dies zu tun:

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

1241voto

Cameron MacFarland Punkte 67889
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;
}

Vergessen Sie nicht, Using zu verwenden:

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

Über die StreamWriter nicht entsorgt werden. StreamWriter ist nur ein Wrapper um den Basisstream und verwendet keine Ressourcen, die entsorgt werden müssen. Die Dispose Methode schließt die zugrunde liegende Stream dass StreamWriter schreibt. In diesem Fall ist das die MemoryStream wir wollen zurückkehren.

In .NET 4.5 gibt es jetzt eine Überladung für StreamWriter die den zugrunde liegenden Stream offen hält, nachdem der Writer entsorgt wurde, aber dieser Code tut dasselbe und funktioniert auch mit anderen Versionen von .NET.

Siehe Gibt es eine Möglichkeit, einen StreamWriter zu schließen, ohne seinen BaseStream zu schließen?

1022voto

joelnet Punkte 12501

Eine andere Lösung:

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

122voto

Josh G Punkte 13806

Fügen Sie dies zu einer statischen String-Utility-Klasse hinzu:

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;
}

Dies fügt eine Erweiterungsfunktion hinzu, so dass Sie einfach können:

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

65voto

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

47voto

Nick N. Punkte 11730

Modernisierte und leicht modifizierte Version der Erweiterungsmethoden für ToStream :

public static Stream ToStream(this string value) => ToStream(value, Encoding.UTF8);

public static Stream ToStream(this string value, Encoding encoding) 
                          => new MemoryStream(encoding.GetBytes(value ?? string.Empty));

Änderung wie in @Palec's Kommentar zur Antwort von @Shaun Bowe vorgeschlagen.


Oder als Einzeiler (vorgeschlagen von @satnhak):

public static Stream ToStream(this string value, Encoding encoding = null) 
    => new MemoryStream((encoding ?? Encoding.UTF8).GetBytes(value ?? string.Empty));

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X