StreamReader与BinaryReader有何不同?

47

StreamReaderBinaryReader 都可用于从二进制文件中获取数据(例如)。

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();
                }
            }

这两者有何区别?在什么情况下应该使用哪一个?


2
一个适用于文本文件,另一个适用于二进制文件?正如您在示例代码中所暗示的那样。 - Adam Houldsworth
1
是的,但假定已编码为UTF-8字符串...因此本质上将是文本。 - Adam Houldsworth
@AdamHouldsworth,一个UTF8字符串不是可以容纳任何信息吗? - Royi Namir
@RoyiNamir "utf8字符串可以包含二进制数据" - 你认为什么是"二进制数据"? - H H
@RoyiNamir - 你的意思是指ASCII范围之外的控制字符和字节吗? - H H
显示剩余3条评论
1个回答

84

StreamReader和BinaryReader都可以用于从二进制文件中获取数据。

StreamReader可以用于从二进制表示的文本中获取文本数据。

BinaryReader可用于获取任意二进制数据。如果这些二进制数据恰好是文本的表示形式,则可以使用它,但不一定是必须的。

总之:

  • 如果你的数据完全是纯文本数据的简单二进制编码,请使用StreamReader
  • 如果你基本上有二进制数据,其中可能会包含一些文本部分,请使用BinaryReader

例如,你不应该尝试使用StreamReader读取JPEG文件。


4
@RoyiNamir: 不,字符串是文本。甚至没有“UTF-8字符串”这样的东西——有一个字符串的UTF-8二进制表示...字符串保存文本数据——它是一系列字符。然后你使用编码(如UTF-8)将其转换为二进制表示形式。请阅读http://csharpindepth.com/Articles/General/Unicode.aspx - Jon Skeet
1
@Nudier:不,StreamReader和BinaryReader都没有继承Stream。在使用StreamReader和BinaryReader时有着非常大的区别。 - Jon Skeet
6
@RoyiNamir:“二进制字符”是一个自相矛盾的说法。这就像谈论“浮点整数”一样。你绝不能将任意二进制数据(例如JPEG文件)读取为文本。你将会丢失信息。 - Jon Skeet
1
@RoyiNamir:在这两种情况下,你是以一种天真的方式将其转换为文本吗?如果是这样,那么你可能会在两种情况下丢失数据,可能是一致的。不要这样做 - 二进制数据不是文本,所以不要试图假装它是。如果你真的需要用文本表示任意二进制数据,请使用base64。 - Jon Skeet
2
@RoyiNamir:Unicode 可以表示几乎任何你想提到的“字符”。但关键词在于“字符”而不是“字节”。字符用于文本。如果你没有文本,那就没有字符。 - Jon Skeet
显示剩余7条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接