Метод ReadExactly
Stream.ReadExactly появился в .NET 7:
метод не возвращает число прочитанных байт -
либо буфер заполнен, либо брошен
EndOfStreamException. С частичным
чтением работает
Read.
Минимум без жёсткого размера -
ReadAtLeast.
Есть ReadExactlyAsync.
Синтаксис
stream.ReadExactly(buffer, offset, count);
Пример
Давайте прочитаем ровно три байта:
using System;
using System.IO;
class Program
{
static void Main()
{
using var ms = new MemoryStream();
ms.Write([1, 2, 3, 4, 5], 0, 5);
ms.Position = 0;
byte[] buf = new byte[3];
ms.ReadExactly(buf, 0, 3);
int res = buf[2];
Console.WriteLine(res);
}
}
Результат выполнения кода:
3
Пример
Давайте прочитаем все пять байт подряд:
using System;
using System.IO;
class Program
{
static void Main()
{
using var ms = new MemoryStream();
ms.Write([1, 2, 3, 4, 5], 0, 5);
ms.Position = 0;
byte[] buf = new byte[5];
ms.ReadExactly(buf, 0, 5);
int res = buf[4];
Console.WriteLine(res);
}
}
Результат выполнения кода:
5
Пример
Давайте запросим больше байт, чем есть, и поймаем нехватку:
using System;
using System.IO;
class Program
{
static void Main()
{
using var ms = new MemoryStream();
ms.Write([1, 2, 3], 0, 3);
ms.Position = 0;
byte[] buf = new byte[5];
try
{
ms.ReadExactly(buf, 0, 5);
}
catch (EndOfStreamException)
{
Console.WriteLine("fail");
}
}
}
Результат выполнения кода:
"fail"
Смотрите также
-
метод
ReadAtLeast,
который читает хотя бы минимум -
метод
Read,
который возвращает фактическое число байт -
метод
Seek,
который ставит позицию перед чтением -
Stream,
класс, где объявленReadExactly