В моем учебнике написано:
Read получает блок данных из потока в массив.Возвращает количество полученных байтов, которое всегда меньше или равно аргументу count.Если он меньше, чем count, это означает, что достигнут конец потока или поток предоставляет вам данные небольшими порциями (как это часто бывает в сетевых потоках).В любом случае баланс байтов в массиве останется не записанным, их прежние значения сохранятся.С помощью Read вы можете быть уверены, что достигли конца потока, только когда метод возвращает 0. Итак, если у вас есть поток длиной 1000 байт, следующий код может не прочитать все это в память:
// Assuming s is a stream:
byte[] data = new byte [1000];
s.Read (data, 0, data.Length);
Метод чтения может считывать от 1 до 1000 байтов, оставляя непрочитанный баланс потока.
Я в замешательстве и пишу простое заключениеприложение для проверки:
//read.txt only contains 3 chars: abc
using (FileStream s = new FileStream("read.txt", FileMode.Open))
{
byte[] data = new byte[5];
int num = s.Read(data, 0, data.Length);
foreach (byte b in data)
{
Console.WriteLine(b);
}
}
и вывод:
97
98
99
0
0
поэтому массив данных был записан, поэтому в учебнике сказано, что «остаток байтов в массиве останется не записанным, и он может не прочитать все это в память»,
РЕДАКТИРОВАТЬ: пожалуйста, откажитесь от моего предыдущего консольного приложения, реальный вопрос, который у меня возникает:
файл имеет 1000 байт, и я прошу прочитать все 1000 байтов:
byte[] data = new byte [1000];
s.Read (data, 0, data.Length);
почему он не может прочитать все это в память?и учебник также предоставляет правильный метод для чтения всех 1000 байтов:
byte[] data = new byte [1000];
int bytesRead = 0;
int chunkSize = 1;
while (bytesRead < data.Length && chunkSize > 0)
bytesRead +=
chunkSize = s.Read (data, bytesRead, data.Length - bytesRead);