StreamReader 与 BinaryReader?
Posted
技术标签:
【中文标题】StreamReader 与 BinaryReader?【英文标题】:StreamReader vs BinaryReader? 【发布时间】:2012-05-08 09:29:24 【问题描述】:StreamReader
和BinaryReader
都可以用来从二进制文件中获取数据(例如)
二进制读取器:
using (FileStream fs = File.Open(@"c:\1.bin",FileMode.Open))
byte[] data = new BinaryReader(fs).ReadBytes((int)fs.Length);
Encoding.getstring....
StreamReader:
using (FileStream fs = File.Open(@"c:\1.bin",FileMode.Open))
using (StreamReader sr = new StreamReader(fs,Encoding.UTF8))
var myString=sr.ReadToEnd();
有什么区别,我应该什么时候使用 which ?
【问题讨论】:
一个适合文本文件,另一个适合二进制文件?正如您在示例代码中所隐瞒的那样。 @Adam Houldsworth utf8 字符串也可以包含二进制数据。 是的,但大概编码为 UTF-8 字符串...所以本质上是文本。 @AdamHouldsworth 不是 utf8 字符串可以保存任何信息吗? @RoyiNamir “utf8 字符串可以包含二进制数据” - 你认为“二进制数据”是什么? 【参考方案1】:StreamReader 和 BinaryReader 都可以用来从二进制文件中获取数据
嗯,StreamReader
可用于从文本的二进制表示中获取文本数据。
BinaryReader
可用于获取任意二进制数据。如果其中一些二进制数据恰好是文本的表示,那很好 - 但不一定是。
底线:
如果您的全部数据是文本数据的直接二进制编码,请使用StreamReader
。
如果您从根本上获得了 二进制 数据,而这些数据可能恰好在文本中有 一些 部分,请使用 BinaryReader
例如,您不会尝试读取带有StreamReader
的JPEG 文件。
【讨论】:
@RoyiNamir:不,字符串就是文本。甚至没有“UTF-8 字符串”之类的东西——有一个字符串的 UTF-8 二进制表示...字符串包含文本数据——它是一个字符序列。然后,您可以使用编码(例如 UTF-8)将其转换为二进制表示。请阅读csharpindepth.com/Articles/General/Unicode.aspx @Nudier:不,StreamReader 和 BinaryReader 都不是从 Stream 派生的。 绝对使用 StreamReader 和使用 BinaryReader 之间存在巨大差异。 @RoyiNamir:“二进制字符”在术语上是矛盾的。这就像在谈论“浮点整数”。您不得将任意二进制数据(例如 JPEG 文件)作为文本读取。您将丢失信息。 @RoyiNamir:在这两种情况下,您是否都以幼稚的方式将其转换为文本?如果是这样,您可能在这两种情况下都会丢失数据,并且可能会一直丢失。只是不要这样做 - 二进制数据不是文本,所以不要试图假装它是。如果确实需要用文本表示任意二进制数据,请使用 base64。 @RoyiNamir:Unicode 几乎可以表示您想提及的任何 字符。但这里的关键词是character——而不是byte。字符用于文本。如果没有文字,就没有字符。以上是关于StreamReader 与 BinaryReader?的主要内容,如果未能解决你的问题,请参考以下文章
逐行读取txt文件,使用Linq与StreamReader的Readline方法
streamReader.ReadToEndAsync() 改变消息内容
按行读取文本或字符串到数组效率测试:StreamReader与Split函数对比