উত্তর:
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
লেখার নিষ্পত্তি হওয়ার পরে অন্তর্নিহিত স্ট্রিমটি উন্মুক্ত রাখার জন্য একটি ওভারলোড রয়েছে তবে এই কোডটি একই কাজ করে এবং নেটওর অন্যান্য সংস্করণগুলির সাথেও কাজ করে।
দেখুন স্ট্রিম রাইটারের বেসস্ট্রিমটি বন্ধ না করে বন্ধ করার কোনও উপায় আছে কি?
GenerateStreamFromString
পদ্ধতিতে আপনি স্ট্রিমাইটার দিয়ে ইউজিং ব্যবহার করছেন না। এরজন্য কি কোন কারণ আছে?
StreamWriter
আপনি সম্ভবত অভ্যন্তরীণভাবে যা বলেছেন তা করছে। সুবিধাটি হ'ল এনক্যাপসুলেশন এবং সহজ কোড, তবে এনকোডিংয়ের মতো জিনিস বিমূর্ত করার জন্য। এটি আপনি কী অর্জন করতে চাইছেন তার উপর নির্ভর করে।
আরেকটি সমাধান:
public static MemoryStream GenerateStreamFromString(string value)
{
return new MemoryStream(Encoding.UTF8.GetBytes(value ?? ""));
}
new MemoryStream(Encoding.UTF8.GetBytes("\ufeff" + (value ?? ""))
আপনার যদি প্রবাহের শুরুতে বিওএম অন্তর্ভুক্ত করা দরকার
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
পদক্ষেপগুলি বাইপাস করতে পারেন could
আমি এর মতো উত্তরের মিশ্রণ ব্যবহার করেছি:
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));
@ শ্যালন বোয়ের উত্তরের @ প্যালেকের মন্তব্যে প্রস্তাবিত পরিবর্তন।
আমি মনে করি আপনি একটি মেমরি স্ট্রিম ব্যবহার করে উপকৃত হতে পারেন । এনকোডিং ক্লাসের গেটবাইটস পদ্ধতি ব্যবহার করে আপনি যে স্ট্রিং বাইটগুলি পেয়েছেন তা পূরণ করতে পারেন ।
আপনার যদি এনকোডিং পরিবর্তন করতে হয় তবে আমি @ শনবউয়ের সমাধানটির পক্ষে ভোট দেব । তবে এখানে প্রতিটি উত্তর কমপক্ষে একবারে পুরো স্ট্রিংটি মেমরিতে অনুলিপি করে। 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