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จะดำเนินต่อไปจนกว่าจะสิ้นสุดของสตรีมหรือขนาดที่คุณระบุ แต่คุณยังต้องรู้ขนาดที่จะเริ่มต้นด้วย
วิธีการข้างต้นจะทำการอ่าน (และคัดลอกไปยัง a MemoryStream) จนกว่าจะหมดข้อมูล จากนั้นจะขอMemoryStreamให้ส่งคืนสำเนาของข้อมูลในอาร์เรย์ หากคุณรู้ว่าขนาดเริ่มต้นด้วย - หรือคิดว่าคุณรู้ขนาดโดยไม่แน่ใจ - คุณสามารถสร้างMemoryStreamขนาดให้เริ่มต้นด้วย ในทำนองเดียวกันคุณสามารถตรวจสอบในตอนท้ายและถ้าความยาวของกระแสมีขนาดเดียวกันกับบัฟเฟอร์ (คืนโดยMemoryStream.GetBuffer) จากนั้นคุณก็สามารถกลับบัฟเฟอร์ ดังนั้นรหัสข้างต้นจึงไม่ได้รับการปรับให้เหมาะสม แต่อย่างน้อยจะต้องถูกต้อง ไม่รับผิดชอบใด ๆ สำหรับการปิดสตรีมผู้เรียกควรทำเช่นนั้น
ดูบทความนี้สำหรับข้อมูลเพิ่มเติม (และการใช้งานทางเลือก)