ReadByte возвращает тип
int, т.к. при достижении конца будет возвращено значение
минус один. А тип
byte может иметь значение в диапазоне от
нуля до
255. То есть, считывая байты, сообщить о достижении конца потока при помощи типа
byte невозможно (байт, имеющий значение ноль может быть полезным байтом), поэтому используется тип
int.
Метод
Read принимает буфер, в который будут помещены считанные данные. Буфер - это массив байт. Изначально он должен быть пустым. Размер массива - по своему смотрению. Чем больше размер буфера, тем больше данных будет помещено в память, меньше проделано операций.
Метод
Read возвращает число помещенных в буфер байт.
Ноль - достигнут конец потока.
FileInfo f = new FileInfo(@"C:\example.dat");
using (FileStream fs = f.Open(FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
{
using (BinaryReader br = new BinaryReader(fs))
{
int bytesRead = 0;
byte[] buffer = new byte[256]; // размер буфера 256 единиц байт
StringBuilder result = new StringBuilder();
while ((bytesRead = br.Read(buffer, 0, buffer.Length)) != 0) // читаем не более 256 единиц байт в buffer
{
// из buffer следует извлекать не более bytesRead (в конце это число может быть меньше 255)
}
}
}
Массивы являются ссылочными типами и нет необходимости использовать
out.