Giảm dòng code của bạn là khá đơn giản ở đây (trong khi vẫn làm việc với dòng tùy ý, thay vì chỉ files):
using (Stream fileStream = File.OpenRead(fileName))
using (MemoryStream memoryStream = new MemoryStream())
{
int byteRead;
while ((byteRead = fileStream.ReadByte()) != -1)
{
memoryStream.WriteByte(byteRead);
}
return memoryStream.ToArray();
}
Rõ ràng đó là một rất nhiều hiệu quả để đọc vào một bộ đệm hơn để đọc một byte tại một thời điểm, nhưng điều này làm giảm số lượng báo cáo (như bạn don không cần khai báo cả một bộ đệm và một biến để giữ giá trị trả lại từ Luồng). Gọi số MemoryStream.ToArray()
đơn giản hơn việc đọc vào một mảng mới được xây dựng.
Sử dụng bộ đệm đẹp hơn. Lưu ý rằng chúng tôi thực sự không cần BinaryReader:
using (Stream fileStream = File.OpenRead(fileName))
using (MemoryStream memoryStream = new MemoryStream())
{
byte[] buffer = new byte[8192];
int bytesRead;
while ((bytesRead = fileStream.Read(buffer, 0, buffer.Length)) > 0)
{
memoryStream.Write(buffer, 0, bytesRead);
}
return memoryStream.ToArray();
}
Nếu bạn muốn trở thành thực sự tàn bạo, chúng ta có thể giảm số lượng các using
báo cáo (với một trong hai giải pháp):
using (Stream fileStream = File.OpenRead(fileName),
memoryStream = new MemoryStream())
{
byte[] buffer = new byte[8192];
int bytesRead;
while ((bytesRead = fileStream.Read(buffer, 0, buffer.Length)) > 0)
{
memoryStream.Write(buffer, 0, bytesRead);
}
return ((MemoryStream)memoryStream).ToArray();
}
Nhưng đó chỉ khó chịu :)
Tùy chọn khác tất nhiên là sử dụng thư viện như MiscUtil có phương thức đọc hoàn toàn từ luồng :) Phương pháp tiện ích có thể đơn giản như sau:
public static byte[] ReadFully(this Stream stream)
{
using (MemoryStream memoryStream = new MemoryStream())
{
byte[] buffer = new byte[8192];
int bytesRead;
while ((bytesRead = stream.Read(buffer, 0, buffer.Length)) > 0)
{
memoryStream.Write(buffer, 0, bytesRead);
}
return memoryStream.ToArray();
}
}
Lưu ý rằng điều này không bao giờ đóng luồng - người gọi nên thực hiện điều đó.
Không phải tất cả các luồng đều trả về chiều dài của chúng mặc dù ... –
data = binaryReader.ReadBytes (stream.Length); phải là data = br.ReadBytes (stream.Length); – OneSHOT
Vâng, chúc mừng. Rõ ràng lỗi đánh máy. – Noldorin