J'ai besoin d'écrire un test unitaire pour une méthode qui prend un flux provenant d'un fichier texte. Je voudrais faire quelque chose comme ça:
Stream s = GenerateStreamFromString("a,b \n c,d");
J'ai besoin d'écrire un test unitaire pour une méthode qui prend un flux provenant d'un fichier texte. Je voudrais faire quelque chose comme ça:
Stream s = GenerateStreamFromString("a,b \n c,d");
StringReaderStream
dans stackoverflow.com/a/55170901/254109Réponses:
N'oubliez pas d'utiliser Using:
À propos de
StreamWriter
ne pas être disposé.StreamWriter
est juste un wrapper autour du flux de base et n'utilise aucune ressource devant être supprimée. LaDispose
méthode fermera le sousStream
- jacent quiStreamWriter
écrit. Dans ce cas, c'est le queMemoryStream
nous voulons retourner.Dans .NET 4.5, il existe maintenant une surcharge
StreamWriter
qui maintient le flux sous-jacent ouvert après la suppression du programme d'écriture, mais ce code fait la même chose et fonctionne également avec d'autres versions de .NET.Voir Existe - t-il un moyen de fermer un StreamWriter sans fermer son BaseStream?
la source
GenerateStreamFromString
méthode, vous n'utilisez pas l'Utilisation avec le StreamWriter. Y a-t-il une raison à cela?StreamWriter
fait probablement de toute façon ce que vous avez dit en interne. L'avantage est l'encapsulation et le code plus simple, mais au prix d'abstraction de choses comme l'encodage. Cela dépend de ce que vous essayez de réaliser.Une autre solution:
la source
new MemoryStream(Encoding.UTF8.GetBytes("\ufeff" + (value ?? ""))
si vous devez inclure la nomenclature au début du fluxnew MemoryStream( value, false )
. Vous ne pouvez pas créer un flux en lecture seule si vous devez l'écrire avec un rédacteur de flux.Ajoutez ceci à une classe utilitaire de chaîne statique:
Cela ajoute une fonction d'extension pour que vous puissiez simplement:
la source
StreamWriter
. Le correctif consistait à utiliser un constructeur différent - celui qui me permettait de spécifier LeaveOpen .la source
Utilisez la
MemoryStream
classe en appelantEncoding.GetBytes
pour transformer d'abord votre chaîne en un tableau d'octets.Avez-vous besoin par la suite d'un
TextReader
sur le flux? Si tel est le cas, vous pouvez fournirStringReader
directement un et contourner les étapesMemoryStream
etEncoding
.la source
J'ai utilisé un mélange de réponses comme celle-ci:
Et puis je l'utilise comme ceci:
la source
Nous utilisons les méthodes d'extension listées ci-dessous. Je pense que vous devriez obliger le développeur à prendre une décision concernant l'encodage, donc il y a moins de magie impliquée.
la source
return ToStream(s, Encoding.UTF8);
. Dans l'implémentation actuelle (return s.ToStream(Encoding.UTF8);
, le développeur est obligé de réfléchir davantage pour saisir le code et il semble que le cas des == null
soit non géré et lanceNullReferenceException
.Voici:
la source
Version modernisée et légèrement modifiée des méthodes d'extension pour
ToStream
:Modification suggérée dans le commentaire @ Palec de la réponse @Shaun Bowe.
la source
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 .
la source
Si vous devez changer l'encodage, je vote pour la solution de @ShaunBowe . Mais chaque réponse ici copie la chaîne entière en mémoire au moins une fois. Les réponses avec
ToCharArray
+BlockCopy
combo le font deux fois.Si cela importe, voici un simple
Stream
wrapper pour la chaîne UTF-16 brute. Si utilisé avec uneStreamReader
sélectionEncoding.Unicode
pour cela:Et voici une solution plus complète avec les vérifications liées nécessaires (dérivées de
MemoryStream
ce qu'il aToArray
et desWriteTo
méthodes également).la source
Une bonne combinaison d'extensions de chaînes:
la source