এটি নির্ভর করে আপনি নির্ভর করতে পারেন কিনা তার উপর s.Length
। অনেকগুলি স্ট্রিমের জন্য, আপনি কেবল জানেন না যে সেখানে কতটা ডেটা থাকবে। এই জাতীয় ক্ষেত্রে - এবং নেট 4 এর আগে - আমি এই জাতীয় কোড ব্যবহার করতাম:
public static byte[] ReadFully(Stream input)
{
byte[] buffer = new byte[16*1024];
using (MemoryStream ms = new MemoryStream())
{
int read;
while ((read = input.Read(buffer, 0, buffer.Length)) > 0)
{
ms.Write(buffer, 0, read);
}
return ms.ToArray();
}
}
.NET 4 এবং উপরের সাথে, আমি ব্যবহার করব Stream.CopyTo
, যা মূলত আমার কোডের লুপের সমান - MemoryStream
কলটি তৈরি করুন stream.CopyTo(ms)
এবং তারপরে ফিরে আসুন ms.ToArray()
। কাজ শেষ.
আমার উত্তরটি কেন অন্যের চেয়ে দীর্ঘ হয় তা সম্ভবত আমার ব্যাখ্যা করা উচিত। Stream.Read
গ্যারান্টি দেয় না যে এটি যা চাওয়া হয়েছে তা পড়বে। আপনি যদি কোনও নেটওয়ার্ক স্ট্রিম থেকে পড়েন, উদাহরণস্বরূপ, এটি একটি প্যাকেটের মূল্য পড়তে পারে এবং তারপরে ফিরে আসতে পারে, যদি খুব শীঘ্রই আরও ডেটা থাকে। BinaryReader.Read
স্ট্রিম বা আপনার নির্দিষ্ট আকারের শেষ হওয়া অবধি চলতে থাকবে, তবে আপনাকে এখনও আকারটি শুরু করতে হবে।
উপরের পদ্ধতিটি MemoryStream
ডেটা শেষ না হওয়া অবধি পড়া (এবং একটিতে অনুলিপি ) রাখবে । এটি তখন MemoryStream
অ্যারেতে ডেটার একটি অনুলিপি ফিরে আসতে বলে । আপনি কি জানেন আকার দিয়ে শুরু করতে - বা মনে আপনি আকার জানি, নিশ্চিত করুন ছাড়াই - আপনি গঠন করা যেতে পারে MemoryStream
যে আকার দিয়ে শুরু করতে হবে। একইভাবে আপনি শেষে একটি চেক রাখতে পারেন, এবং যদি প্রবাহের দৈর্ঘ্য বাফারের সমান আকার হয় (ফিরে আসে MemoryStream.GetBuffer
) তবে আপনি কেবল বাফারটি ফিরিয়ে দিতে পারবেন। সুতরাং উপরের কোডটি বেশ অপ্টিমাইজড নয়, তবে কমপক্ষে সঠিক হবে। এটি স্ট্রিম বন্ধ করার জন্য কোনও দায়বদ্ধতা গ্রহণ করে না - কলকারীকে এটি করা উচিত।
আরও তথ্যের জন্য এই নিবন্ধটি দেখুন (এবং একটি বিকল্প বাস্তবায়ন)।