一个优雅的方式来消费(BinaryReader的所有字节)?

BinaryReader模拟StreamReader.ReadToEnd方法有没有优雅? 也许把所有的字节放入一个字节数组?

我这样做:

 read1.ReadBytes((int)read1.BaseStream.Length); 

…但是一定有更好的办法。

简单地做:

 byte[] allData = read1.ReadBytes(int.MaxValue); 

该文件说,它将读取所有字节,直到到达stream的末尾。


更新

虽然这看起来很优雅,文档似乎表明,这将工作,实际的实现 (检查.NET 2,3.5和4)为数据分配一个完整的字节数组,这可能会导致一个OutOfMemoryException 32位系统。

因此,我想说实际上没有一个优雅的方式

相反,我会build议@ iano的答案的以下变化。 这个变体不依赖于.NET 4:
BinaryReader (或者Stream ,代码是相同的)创build一个扩展方法。

 public static byte[] ReadAllBytes(this BinaryReader reader) { const int bufferSize = 4096; using (var ms = new MemoryStream()) { byte[] buffer = new byte[bufferSize]; int count; while ((count = reader.Read(buffer, 0, buffer.Length)) != 0) ms.Write(buffer, 0, count); return ms.ToArray(); } } 

用BinaryReader并不是一个简单的方法。 如果你不知道计数你需要提前阅读,更好的select是使用MemoryStream:

 public byte[] ReadAllBytes(Stream stream) { using (var ms = new MemoryStream()) { stream.CopyTo(ms); return ms.ToArray(); } } 

要在调用ToArray()时避免额外的副本,可以通过GetBuffer()返回Position和缓冲区。

要复制stream的内容到另一个,我已经解决了阅读“一些”字节,直到达到文件的末尾:

 private const int READ_BUFFER_SIZE = 1024; using (BinaryReader reader = new BinaryReader(responseStream)) { using (BinaryWriter writer = new BinaryWriter(File.Open(localPath, FileMode.Create))) { int byteRead = 0; do { byte[] buffer = reader.ReadBytes(READ_BUFFER_SIZE); byteRead = buffer.Length; writer.Write(buffer); byteTransfered += byteRead; } while (byteRead == READ_BUFFER_SIZE); } } 

解决这个问题的另一种方法是使用C#扩展方法:

 public static class StreamHelpers { public static byte[] ReadAllBytes(this BinaryReader reader) { // Pre .Net version 4.0 const int bufferSize = 4096; using (var ms = new MemoryStream()) { byte[] buffer = new byte[bufferSize]; int count; while ((count = reader.Read(buffer, 0, buffer.Length)) != 0) ms.Write(buffer, 0, count); return ms.ToArray(); } // .Net 4.0 or Newer using (var ms = new MemoryStream()) { stream.CopyTo(ms); return ms.ToArray(); } } } 

使用这种方法将允许可重用​​以及可读代码。