【问题标题】:StreamReader ReadBlock hangs on binary filesStreamReader ReadBlock 挂在二进制文件上
【发布时间】:2010-08-19 06:12:51
【问题描述】:

我有一个小类,它接受来自包含文件上传的浏览器的 POST。我正在使用 StreamReader 来读取它。我读取了标题,然后当我到达正文时,我得到了内容长度并创建了一个该大小的数组,然后stream.ReadBlock()

char[] buffer = new char[contentLength];
stream.ReadBlock(buffer, 0, contentLength);
String body = new string(buffer);

当我运行它并发布一个文本文件时,它工作正常。但是,我尝试了 ZIP 文件和 MP3 文件,但这些都不起作用。它只是挂在stream.ReadBlock() 电话上。

我首先在 Ubuntu 10.04 上使用 Mono 2.6.7 进行了尝试(我的 MonoDevelop 项目设置为使用 .net 3.5)。我刚刚通过在 VisualStudio 2010 和 .net 3.5 中运行相同的项目验证了在 Windows7 上发生了同样的事情。我尝试过从 Firefox 和 Chrome 发布。

有人知道为什么会发生这种情况吗?谢谢。

我也尝试使用 BinaryReader 而不是 StreamReader:

byte[] bytes = reader.ReadBytes(contentLength);

但不管现在如何,它最终都会挂在那个电话上。是不是因为我使用 StreamReader 读取 POST 的标头,然后使用 BinaryReader 读取正文?

【问题讨论】:

    标签: c# mono streamreader readblock


    【解决方案1】:

    StreamReader 用于 文本 数据。您不应该在二进制数据上使用它 - 您应该使用 BinaryReader 或只使用 Stream

    【讨论】:

    • 我将其更改为使用 BinaryReader,但它仍然挂起阅读。
    • 我知道 StreamReader 用于文本,而 BinaryReader 用于二进制文件。但这能解释为什么它会卡在阅读上吗?文本阅读器不会仍然读入它,只是用编码之类的东西弄脏内容吗?
    • 如果我不知道我正在获取什么类型的数据,那么只使用 BinaryReader 是否安全?
    【解决方案2】:

    使用 StreamReader 不适合二进制文件。它会做各种各样的文本编码工作,并且通常(可能)搞砸。

    一旦您确定您正在使用的文件是二进制文件,您应该直接使用 Stream 对象来读取(部分)文件。这样,您就不必处理混淆内容的编码。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-10-27
      • 1970-01-01
      • 1970-01-01
      • 2013-05-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多