StreamReader против BinaryReader?

И StreamReader, и BinaryReader можно использовать для получения данных из двоичного файла (например)

Двоичное чтение:

   using (FileStream fs = File.Open(@"c:\1.bin",FileMode.Open))
            {
                    byte[] data = new BinaryReader(fs).ReadBytes((int)fs.Length);
                    Encoding.getstring....
            }

ПотоковоеЧтение:

  using (FileStream fs = File.Open(@"c:\1.bin",FileMode.Open))
            {
                using (StreamReader sr = new StreamReader(fs,Encoding.UTF8))
                {
                       var myString=sr.ReadToEnd();
                }
            }

В чем разница и когда я должен использовать какой ?


person Royi Namir    schedule 27.04.2012    source источник
comment
Один подходит для текстовых файлов, другой для бинарных файлов? Как вы даже избегаете в своем примере кода.   -  person Adam Houldsworth    schedule 27.04.2012
comment
Строка @Adam Houldsworth utf8 также может содержать двоичные данные.   -  person Royi Namir    schedule 27.04.2012
comment
Да, но предположительно закодированный как строка UTF-8... так что по сути это будет текст.   -  person Adam Houldsworth    schedule 27.04.2012
comment
@AdamHouldsworth разве строка utf8 не может содержать какую-либо информацию?   -  person Royi Namir    schedule 27.04.2012
comment
Строка @RoyiNamir utf8 может содержать двоичные данные — что вы считаете двоичными данными?   -  person Henk Holterman    schedule 27.04.2012
comment
@HenkHolterman для eaxmple: просмотр содержимого JPEG в Total Commander   -  person Royi Namir    schedule 27.04.2012
comment
@RoyiNamir - вы имеете в виду управляющие символы и байты за пределами диапазона ASCII?   -  person Henk Holterman    schedule 27.04.2012
comment
@Adam Houldsworth: И потоки, и массивы байтов могут содержать двоичные данные. Двоичные файлы также можно читать/записывать с диска или даже через сетевые сокеты любым из этих способов. См. GetStreamAsync и GetByteArrayAsync методы System.Net.Http.Httpclient в качестве примера.   -  person Zimba    schedule 19.11.2019


Ответы (1)


И StreamReader, и BinaryReader могут использоваться для получения данных из двоичного файла.

Что ж, StreamReader можно использовать для получения текстовых данных из двоичного представления текста.

BinaryReader можно использовать для получения произвольных двоичных данных. Если некоторые из этих двоичных данных представляют собой текст, это нормально, но это не обязательно.

Нижняя линия:

  • Если все ваши данные представляют собой простое двоичное кодирование текстовых данных, используйте StreamReader.
  • Если у вас есть бинарные данные, которые могут иметь некоторые части в тексте, используйте BinaryReader

Так, например, вы не попытаетесь прочитать файл JPEG с помощью StreamReader.

person Jon Skeet    schedule 27.04.2012
comment
но строка utf8 может содержать даже двоичные данные.. так что...? - person Royi Namir; 27.04.2012
comment
разве строка utf8 не может содержать какую-либо информацию? - person Royi Namir; 27.04.2012
comment
@RoyiNamir: Нет, строка — это текст. Нет даже такой вещи, как строка UTF-8 - есть двоичное представление строки UTF-8... Строка содержит текстовые данные - это последовательность символов. Затем вы преобразуете это в двоичное представление, используя кодировку, например UTF-8. Прочтите csharpindepth.com/Articles/General/Unicode.aspx. - person Jon Skeet; 27.04.2012
comment
как вы, возможно, знаете, все они наследуются от потока базового класса, поэтому нет никакой разницы в использовании одного из них. - person Nudier Mena; 27.04.2012
comment
@jon я говорю, что нет двоичного символа, который я не могу сохранить в строке ... поэтому я могу преобразовать содержимое корзины в строку через StreamReader и BinaryReader - person Royi Namir; 27.04.2012
comment
@Nudier: Нет, ни StreamReader, ни BinaryReader не являются производными от Stream. Существует абсолютно огромная разница между использованием StreamReader и BinaryReader. - person Jon Skeet; 27.04.2012
comment
@RoyiNamir: Двоичный символ - это противоречие в терминах. Это как говорить о целом числе с плавающей запятой. Вы не должны читать произвольные двоичные данные (например, файл JPEG) как текст. Вы будете терять информацию. - person Jon Skeet; 27.04.2012
comment
@jon хорошо ... последнее: я только что прочитал файл jpeg с помощью двоичного считывателя - размер массива байтов был 740. чем я прочитал с помощью потокового считывателя - в строку - длина строки была все еще 740 .... так что ... ? - person Royi Namir; 27.04.2012
comment
@RoyiNamir: Вы наивно конвертируете его в текст в обоих случаях? Если это так, вы, вероятно, теряете данные в обоих случаях, возможно, последовательно. Просто не делайте этого - двоичные данные не являются текстом, так что не пытайтесь притворяться, что это так. Если вам действительно нужно представить произвольные двоичные данные в виде текста, используйте base64. - person Jon Skeet; 27.04.2012
comment
@JonSkeet, у меня проблема. Юникод только для текста. Я думал, что это может также представлять некоторые уродливые персонажи. это было источником моей ошибки. Благодарю. - person Royi Namir; 27.04.2012
comment
@RoyiNamir: Юникод может представлять практически любой символ, который вы захотите упомянуть. Но ключевое слово здесь символ, а не байт. Символы предназначены для текста. Если у вас нет текста, у вас нет символов. - person Jon Skeet; 27.04.2012
comment
@giorgim: Вот почему вы можете потерять данные. И, по сути, это просто плохая идея - обращаться с данными одной формы как с другой - это побуждает вас выполнять с ними всевозможные неуместные операции. - person Jon Skeet; 10.12.2014