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