c# - ultimos - ¿Cómo genero un flujo desde una cadena?
quitar los primeros 3 caracteres de una cadena c# (12)
Necesito escribir una prueba de unidad para un método que toma un flujo que proviene de un archivo de texto. Me gustaría hacer algo como esto:
Stream s = GenerateStreamFromString("a,b /n c,d");
Agregue esto a una clase de utilidad de cadena estática:
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;
}
Esto agrega una función de extensión para que pueda simplemente:
using (var stringStream = "My string".ToStream())
{
// use stringStream
}
Aqui tienes:
private Stream GenerateStreamFromString(String p)
{
Byte[] bytes = UTF8Encoding.GetBytes(p);
MemoryStream strm = new MemoryStream();
strm.Write(bytes, 0, bytes.Length);
return strm;
}
Creo que puede beneficiarse de utilizar un MemoryStream . Puede rellenarlo con los bytes de cadena que obtiene utilizando el método GetBytes de la clase de codificación .
Otra solución:
public static MemoryStream GenerateStreamFromString(string value)
{
return new MemoryStream(Encoding.UTF8.GetBytes(value ?? ""));
}
Una buena combinación de extensiones de cuerdas:
public static byte[] GetBytes(this string str)
{
byte[] bytes = new byte[str.Length * sizeof(char)];
System.Buffer.BlockCopy(str.ToCharArray(), 0, bytes, 0, bytes.Length);
return bytes;
}
public static Stream ToStream(this string str)
{
Stream StringStream = new MemoryStream();
StringStream.Read(str.GetBytes(), 0, str.Length);
return StringStream;
}
Usé una mezcla de respuestas como esta:
public static Stream ToStream(this string str, Encoding enc = null)
{
enc = enc ?? Encoding.UTF8;
return new MemoryStream(enc.GetBytes(str ?? ""));
}
Y luego lo uso así:
String someStr="This is a Test";
Encoding enc = getEncodingFromSomeWhere();
using (Stream stream = someStr.ToStream(enc))
{
// Do something with the stream....
}
Use la clase MemoryStream
, que llama a Encoding.GetBytes
para convertir su cadena en una matriz de bytes primero.
¿Necesita posteriormente un TextReader
en la transmisión? Si es así, puede proporcionar un StringReader
directamente y omitir los pasos de MemoryStream
y Encoding
.
Utilizamos los métodos de extensión que se enumeran a continuación. Creo que deberías hacer que el desarrollador tome una decisión sobre la codificación, para que haya menos magia involucrada.
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 ?? ""));
}
}
Versión ligeramente modificada de los métodos de extensión sugeridos en un comentario de la respuesta de @ JoelNet y la respuesta de @Shaun Bowe. Porque estoy de acuerdo con el comentario de @ Palec.
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));
/// <summary>
/// Get Byte[] from String
/// </summary>
/// <param name="str"></param>
/// <returns></returns>
public static byte[] GetBytes(string str)
{
byte[] bytes = new byte[str.Length * sizeof(char)];
System.Buffer.BlockCopy(str.ToCharArray(), 0, bytes, 0, bytes.Length);
return bytes;
}
/// <summary>
/// Get Stream from String
/// </summary>
/// <param name="str"></param>
/// <returns></returns>
public static Stream GetStream(string str)
{
return new MemoryStream(GetBytes(str));
}
public Stream GenerateStreamFromString(string s)
{
return new MemoryStream(Encoding.UTF8.GetBytes(s));
}
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;
}
No te olvides de usar el uso de:
using (var stream = GenerateStreamFromString("a,b /n c,d"))
{
// ... Do stuff to stream
}
Sobre el StreamWriter
no está dispuesto. StreamWriter
es solo una envoltura alrededor del flujo base y no utiliza ningún recurso que deba eliminarse. El método Dispose
cerrará la Stream
subyacente en la que StreamWriter
está escribiendo. En este caso ese es el MemoryStream
que queremos devolver.
En .NET 4.5 ahora hay una sobrecarga para StreamWriter
que mantiene abierta la secuencia subyacente después de que se StreamWriter
el escritor, pero este código hace lo mismo y funciona con otras versiones de .NET también.
Consulte ¿Hay alguna forma de cerrar un StreamWriter sin cerrar su BaseStream?