Comment générer un stream à partir d’une chaîne?

Je dois écrire un test unitaire pour une méthode qui prend un stream provenant d’un fichier texte. Je voudrais faire quelque chose comme ça:

Stream s = GenerateStreamFromSsortingng("a,b \nc,d"); 

 public static Stream GenerateStreamFromSsortingng(ssortingng s) { var stream = new MemoryStream(); var writer = new StreamWriter(stream); writer.Write(s); writer.Flush(); stream.Position = 0; return stream; } 

N’oubliez pas d’utiliser

 using (var stream = GenerateStreamFromSsortingng("a,b \nc,d")) { // ... Do stuff to stream } 

À propos du StreamWriter non éliminé StreamWriter est juste un wrapper autour du stream de base et n’utilise aucune ressource à éliminer. La méthode Dispose ferme le Stream sous-jacent sur lequel StreamWriter écrit. Dans ce cas, c’est le MemoryStream nous voulons renvoyer.

Dans .NET 4.5, il existe désormais une surcharge pour StreamWriter qui maintient le stream sous-jacent ouvert après la StreamWriter du programme d’écriture, mais ce code fait la même chose et fonctionne également avec d’autres versions de .NET.

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

Une autre solution:

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

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

 public static Stream ToStream(this ssortingng 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 ssortingngStream = "My ssortingng".ToStream()) { // use ssortingngStream } 
 public Stream GenerateStreamFromSsortingng(ssortingng s) { return new MemoryStream(Encoding.UTF8.GetBytes(s)); } 

Utilisez la classe MemoryStream , en 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 stream? Si tel est le cas, vous pouvez fournir un SsortingngReader directement et SsortingngReader les étapes MemoryStream et Encoding .

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

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

Et puis je l’utilise comme ceci:

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

Voici:

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

Je pense que vous pouvez bénéficier de l’utilisation d’un MemoryStream . Vous pouvez le remplir avec les octets de chaîne que vous obtenez en utilisant la méthode GetBytes de la classe Encoding .

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 concernant l’encodage, de sorte qu’il ya moins de magie.

 public static class SsortingngExtensions { public static Stream ToStream(this ssortingng s) { return s.ToStream(Encoding.UTF8); } public static Stream ToStream(this ssortingng s, Encoding encoding) { return new MemoryStream(encoding.GetBytes(s ?? "")); } } 

Version légèrement modifiée des méthodes d’extension suggérées dans un commentaire de la réponse de @JoelNet et de la réponse de @Shaun Bowe. Parce que je suis d’accord avec le commentaire de @ Palec.

 public static Stream ToStream(this ssortingng value) => ToStream(value, Encoding.UTF8); public static Stream ToStream(this ssortingng value, Encoding encoding) => new MemoryStream(encoding.GetBytes(value ?? ssortingng.Empty)); 
 ///  /// Get Byte[] from Ssortingng ///  ///  ///  public static byte[] GetBytes(ssortingng str) { byte[] bytes = new byte[str.Length * sizeof(char)]; System.Buffer.BlockCopy(str.ToCharArray(), 0, bytes, 0, bytes.Length); return bytes; } ///  /// Get Stream from Ssortingng ///  ///  ///  public static Stream GetStream(ssortingng str) { return new MemoryStream(GetBytes(str)); } 

Une bonne combinaison d’extensions de chaîne:

 public static byte[] GetBytes(this ssortingng 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 ssortingng str) { Stream SsortingngStream = new MemoryStream(); SsortingngStream.Read(str.GetBytes(), 0, str.Length); return SsortingngStream; }