එය සැබවින්ම රඳා පවතින්නේ ඔබට විශ්වාස කළ හැකිද නැද්ද යන්න මතය 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) එවිට ඔබට බෆරය ආපසු ලබා දිය හැකිය. එබැවින් ඉහත කේතය තරමක් ප්රශස්ත නොවේ, නමුත් අවම වශයෙන් නිවැරදි වනු ඇත. ධාරාව වැසීම සඳහා එය කිසිදු වගකීමක් භාර නොගනී - අමතන්නා එය කළ යුතුය.
වැඩි විස්තර සඳහා මෙම ලිපිය බලන්න (සහ විකල්ප ක්රියාත්මක කිරීමක්).