यह वास्तव में इस बात पर निर्भर करता है कि आप भरोसा कर सकते हैं या नहीं s.Length
। कई धाराओं के लिए, आपको पता नहीं है कि कितना डेटा होगा। ऐसे मामलों में - और .NET 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
तब तक वापस लौटा दी जाती है ) तो आप बफर को वापस कर सकते हैं। इसलिए उपरोक्त कोड काफी अनुकूलित नहीं है, लेकिन कम से कम सही होगा। यह धारा को बंद करने के लिए कोई जिम्मेदारी नहीं लेता है - कॉल करने वाले को ऐसा करना चाहिए।
अधिक जानकारी के लिए यह लेख देखें (और एक वैकल्पिक कार्यान्वयन)।