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");

30voto

Robocide Punkte 5920

Ich habe eine Mischung von Antworten wie diese verwendet:

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

Und dann verwende ich es so:

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

26voto

Tim Robinson Punkte 51702

Verwenden Sie die MemoryStream Klasse, Aufruf Encoding.GetBytes um Ihre Zeichenkette zunächst in ein Array von Bytes zu verwandeln.

Benötigen Sie anschließend eine TextReader auf dem Stream? Wenn ja, könnten Sie eine StringReader direkt und unter Umgehung des MemoryStream et Encoding Schritte.

18voto

Shaun Bowe Punkte 9412

Wir verwenden die unten aufgeführten Verlängerungsmethoden. Ich denke, Sie sollten den Entwickler eine Entscheidung über die Kodierung treffen lassen, damit weniger Magie im Spiel ist.

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 ?? ""));
    }
}

14voto

György Kőszeg Punkte 14935

Wenn Sie die Kodierung ändern müssen, stimme ich für @ShaunBowe Lösung. Aber jede Antwort hier kopiert die gesamte Zeichenkette mindestens einmal in den Speicher. Die Antworten mit ToCharArray + BlockCopy Combo macht es zweimal.

Falls das wichtig ist, hier eine einfache Stream Wrapper für die rohe UTF-16-Zeichenkette. Bei Verwendung mit einer StreamReader Wählen Sie Encoding.Unicode für sie:

public class StringStream : Stream
{
    private readonly string str;

    public override bool CanRead => true;
    public override bool CanSeek => true;
    public override bool CanWrite => false;
    public override long Length => str.Length * 2;
    public override long Position { get; set; } // TODO: bounds check

    public StringStream(string s) => str = s ?? throw new ArgumentNullException(nameof(s));

    public override long Seek(long offset, SeekOrigin origin)
    {
        switch (origin)
        {
            case SeekOrigin.Begin:
                Position = offset;
                break;
            case SeekOrigin.Current:
                Position += offset;
                break;
            case SeekOrigin.End:
                Position = Length - offset;
                break;
        }

        return Position;
    }

    private byte this[int i] => (i & 1) == 0 ? (byte)(str[i / 2] & 0xFF) : (byte)(str[i / 2] >> 8);

    public override int Read(byte[] buffer, int offset, int count)
    {
        // TODO: bounds check
        var len = Math.Min(count, Length - Position);
        for (int i = 0; i < len; i++)
            buffer[offset++] = this[(int)(Position++)];
        return (int)len;
    }

    public override int ReadByte() => Position >= Length ? -1 : this[(int)Position++];
    public override void Flush() { }
    public override void SetLength(long value) => throw new NotSupportedException();
    public override void Write(byte[] buffer, int offset, int count) => throw new NotSupportedException();
    public override string ToString() => str; // ;)     
}

Und aquí ist eine vollständigere Lösung mit den erforderlichen Überprüfungen (abgeleitet aus MemoryStream so hat es ToArray et WriteTo Methoden).

9voto

Konamiman Punkte 48557

Ich denke, Sie können von der Verwendung einer MemoryStream . Sie können es mit den String-Bytes füllen, die Sie mit dem Befehl GetBytes Methode der Kodierungsklasse .

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