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