При работе с бинарными потоками (т.е. byte[]
массивы) основной смысл использования BinaryReader
или BinaryWriter
представляется упрощенным чтением/записью примитивных типов данных из потока с использованием таких методов, как ReadBoolean()
и принимая во внимание кодировку. Это целая история? Есть ли неотъемлемое преимущество или недостаток, если вы работаете напрямую с Stream
, не используя BinaryReader/BinaryWriter
? Большинство методов, таких как Read()
, кажутся одинаковыми в обоих классах, и я предполагаю, что они работают одинаково под ним.
Рассмотрим простой пример обработки двоичного файла двумя разными способами (редактирование: я понимаю, что этот способ неэффективен и что можно использовать буфер, это просто образец):
// Using FileStream directly
using (FileStream stream = new FileStream("file.dat", FileMode.Open))
{
// Read bytes from stream and interpret them as ints
int value = 0;
while ((value = stream.ReadByte()) != -1)
{
Console.WriteLine(value);
}
}
// Using BinaryReader
using (BinaryReader reader = new BinaryReader(FileStream fs = new FileStream("file.dat", FileMode.Open)))
{
// Read bytes and interpret them as ints
byte value = 0;
while (reader.BaseStream.Position < reader.BaseStream.Length)
{
value = reader.ReadByte();
Console.WriteLine(Convert.ToInt32(value));
}
}
Результат будет таким же, но что происходит внутри (например, с точки зрения ОС)? Является ли, вообще говоря, важным, какая реализация используется? Есть ли смысл использовать BinaryReader/BinaryWriter
, если вам не нужны дополнительные методы, которые они предоставляют?
В этом конкретном случае MSDN говорит об этом в отношении Stream.ReadByte()
:
Реализация по умолчанию для Stream создает новый однобайтовый массив а затем вызывает чтение. Хотя это формально правильно, неэффективен.
Используя GC.GetTotalMemory()
, этот первый подход, как представляется, выделяет 2x столько же места, сколько и второе, но AFAIK это не должно быть, если используется более общий метод Stream.Read()
(например, для чтения в кусках, используя буфер). Тем не менее, мне кажется, что эти методы/интерфейсы могут быть легко унифицированы...