Question Comment générer un flux à partir d'une chaîne?


Je dois écrire un test unitaire pour une méthode qui prend un flux qui provient d'un fichier texte. Je voudrais faire quelque chose comme ceci:

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

594
2017-12-10 08:14


origine


Réponses:


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

Ne pas oublier d'utiliser

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

À propos de StreamWriter n'étant pas disposé. StreamWriter est juste une enveloppe autour du flux de base, et n'utilise aucune ressource qui doit être éliminée. le Dispose méthode va fermer le sous-jacent Stream cette StreamWriter écrit à. Dans ce cas, c'est le MemoryStream nous voulons revenir.

Dans .NET 4.5, il y a maintenant une surcharge pour StreamWriter Cela permet de garder le flux sous-jacent ouvert après le retrait de l'éditeur, mais ce code fait la même chose et fonctionne avec les autres versions de .NET.

Voir Est-il possible de fermer un StreamWriter sans fermer son BaseStream?


767
2017-12-10 08:28



Une autre solution:

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

572
2018-03-08 21:02



Ajoutez ceci à une classe d'utilitaire de chaîne statique:

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

Cela ajoute une fonction d'extension afin que vous puissiez simplement:

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

98
2018-03-25 15:08



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

34
2018-01-03 18:19



Utilisez le MemoryStream classe, appelant Encoding.GetBytes pour transformer votre chaîne en un tableau d'octets en premier.

Avez-vous besoin par la suite d'un TextReader sur le flux? Si oui, vous pouvez fournir un StringReader directement, et contourner le MemoryStream et Encoding pas.


20
2017-12-10 08:17



J'ai utilisé un mélange de réponses comme ceci:

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

Et puis je l'utilise comme ceci:

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

11
2018-02-03 09:36



Voici:

private Stream GenerateStreamFromString(String p)
{
    Byte[] bytes = UTF8Encoding.GetBytes(p);
    MemoryStream strm = new MemoryStream();
    strm.Write(bytes, 0, bytes.Length);
    return strm;
}

9
2017-12-10 08:27



Je pense que vous pouvez bénéficier d'un MemoryStream. Vous pouvez le remplir avec les octets de chaîne que vous obtenez en utilisant le GetBytes méthode de Classe d'encodage.


8
2017-12-10 08:18



Nous utilisons les méthodes d'extension listées ci-dessous. Je pense que vous devriez faire en sorte que le développeur prenne une décision sur l'encodage, donc il y a moins de magie impliquée.

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

7
2017-07-15 15:19



Version légèrement modifiée des méthodes d'extension suggérées dans un commentaire de la réponse @ JoelNet et @Shaun Bowe réponse. Parce que je suis d'accord avec le commentaire 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));

0
2018-03-01 12:37



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

-1
2018-02-08 13:34