जवाबों:
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;
}
उपयोग करना न भूलें:
using (var stream = GenerateStreamFromString("a,b \n c,d"))
{
// ... Do stuff to stream
}
बारे में StreamWriter
निपटारा नहीं किया जा रहा। StreamWriter
बस बेस स्ट्रीम के आसपास एक आवरण है, और किसी भी संसाधन का उपयोग नहीं करता है जिसे निपटाने की आवश्यकता है। Dispose
विधि बंद हो जाएगा अंतर्निहित Stream
है कि StreamWriter
करने के लिए लिख रहे हैं। इस मामले में कि MemoryStream
हम लौटना चाहते हैं।
.NET 4.5 में अब एक अधिभार है StreamWriter
जो लेखक के निपटारे के बाद अंतर्निहित स्ट्रीम को खुला रखता है, लेकिन यह कोड यही काम करता है और .NET के अन्य संस्करणों के साथ भी काम करता है।
देखें कि क्या कोई बेस स्ट्रीमर को बंद किए बिना किसी स्ट्रीमराइटर को बंद करने का कोई तरीका है?
GenerateStreamFromString
तरीके में आप StreamWriter के साथ प्रयोग नहीं कर रहे हैं। क्या इसका कोई कारण है?
StreamWriter
शायद वही कर रहे हैं जो आपने वैसे भी आंतरिक रूप से कहा था। लाभ एन्कैप्सुलेशन और सरल कोड है, लेकिन इनकोडिंग की तरह अमूर्त चीजों की कीमत पर। यह इस बात पर निर्भर करता है कि आप क्या हासिल करना चाहते हैं।
एक और समाधान:
public static MemoryStream GenerateStreamFromString(string value)
{
return new MemoryStream(Encoding.UTF8.GetBytes(value ?? ""));
}
new MemoryStream(Encoding.UTF8.GetBytes("\ufeff" + (value ?? ""))
अगर आपको BOM स्ट्रीम की शुरुआत में शामिल होना चाहिए
new MemoryStream( value, false )
। यदि आप इसे स्ट्रीम लेखक के साथ लिखना चाहते हैं तो आप एक स्ट्रीम आसानी से नहीं बना सकते।
इसे स्टैटिक स्ट्रिंग यूटिलिटी क्लास में जोड़ें:
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;
}
यह एक एक्सटेंशन फ़ंक्शन जोड़ता है ताकि आप बस:
using (var stringStream = "My string".ToStream())
{
// use stringStream
}
StreamWriter
। फ़िक्स को एक अलग कंस्ट्रक्टर का उपयोग करना था - एक जिसने मुझे लीवऑन को निर्दिष्ट करने की अनुमति दी ।
पहले बाइट्स के एक सरणी में अपने स्ट्रिंग को चालू करने के लिए MemoryStream
कॉल Encoding.GetBytes
करते हुए, क्लास का उपयोग करें ।
क्या आपको बाद TextReader
में धारा पर कोई ज़रूरत है ? यदि हां, तो आप StringReader
सीधे आपूर्ति कर सकते हैं , MemoryStream
और Encoding
कदमों को दरकिनार कर सकते हैं ।
मैंने इस तरह के उत्तर का मिश्रण इस्तेमाल किया:
public static Stream ToStream(this string str, Encoding enc = null)
{
enc = enc ?? Encoding.UTF8;
return new MemoryStream(enc.GetBytes(str ?? ""));
}
और फिर मैं इसे इस तरह से उपयोग करता हूं:
String someStr="This is a Test";
Encoding enc = getEncodingFromSomeWhere();
using (Stream stream = someStr.ToStream(enc))
{
// Do something with the stream....
}
हम नीचे सूचीबद्ध एक्सटेंशन विधियों का उपयोग करते हैं। मुझे लगता है कि आपको डेवलपर को एन्कोडिंग के बारे में निर्णय लेना चाहिए, इसलिए इसमें कम जादू शामिल है।
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 ?? ""));
}
}
return ToStream(s, Encoding.UTF8);
। वर्तमान कार्यान्वयन में ( return s.ToStream(Encoding.UTF8);
, डेवलपर को कोड को समझने के लिए कठिन सोचने के लिए मजबूर किया जाता है और ऐसा लगता है कि मामला s == null
NullReferenceException
हेयर यू गो:
private Stream GenerateStreamFromString(String p)
{
Byte[] bytes = UTF8Encoding.GetBytes(p);
MemoryStream strm = new MemoryStream();
strm.Write(bytes, 0, bytes.Length);
return strm;
}
के लिए विस्तार विधियों का आधुनिकीकरण और थोड़ा संशोधित संस्करण ToStream
:
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));
संशोधन के रूप में @ पलाश की टिप्पणी @ पलक की टिप्पणी में उत्तर दिया गया।
मुझे लगता है कि आप मेमोरीस्ट्रीम का उपयोग करके लाभ उठा सकते हैं । आप इसे एन्कोडिंग वर्ग के गेटबाइट्स विधि का उपयोग करके प्राप्त होने वाले स्ट्रिंग बाइट्स के साथ भर सकते हैं ।
यदि आपको @ShaunBowe के समाधान के लिए मेरे द्वारा दिए गए एन्कोडिंग को बदलने की आवश्यकता है । लेकिन यहां हर उत्तर कम से कम एक बार पूरे स्ट्रिंग को मेमोरी में कॉपी करता है। ToCharArray
+ BlockCopy
कॉम्बो के साथ उत्तर दो बार करते हैं।
यदि यह मायने रखता है Stream
तो कच्चे UTF-16 स्ट्रिंग के लिए एक सरल आवरण है। यदि इसके लिए StreamReader
चयन के साथ प्रयोग किया जाता Encoding.Unicode
है:
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; // ;)
}
और यहाँ आवश्यक बाउंड चेक के साथ एक और अधिक पूर्ण समाधान है ( MemoryStream
ताकि यह भी है ToArray
और WriteTo
साथ ही तरीके)।
स्ट्रिंग एक्सटेंशन का एक अच्छा संयोजन:
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;
}
StringReaderStream
में stackoverflow.com/a/55170901/254109