Что за страности в Stream в.NET?

Всем привет. Изучая потомков класса Stream наткнулся на одну интересную особенность, которая не дает мне покоя.
Во-первых почему ReadByte() возвращает int? Выводя этот int на консоль, я что-то не заметил восьмеричной системы счисления.
Во-вторых для чего Read() первым параметром получает массив байтов? Что должно быть в этом массиве? Что метод делает с этим массивом? Ни in ни out перед аргументом нет.
  • Вопрос задан
  • 2536 просмотров
Решения вопроса 1
AlekseyNemiro
@AlekseyNemiro
full-stack developer
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.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
AxisPod
@AxisPod
> Выводя этот int на консоль, я что-то не заметил восьмеричной системы счисления.

А почему должны были? Значение числа оно всегда одинаково и не зависит от системы счисление. А вот его отображение может меняться. Можно даже пальцами показать, или узелками на веревке.

> Во-вторых для чего Read() первым параметром получает массив байтов? Что должно быть в этом массиве? Что метод делает с этим массивом? Ни in ни out перед аргументом нет.

Наверное следовало бы изучить для начала C# и понять, что такое ссылочный тип.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы