【发布时间】:2013-06-21 01:46:46
【问题描述】:
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
Stream stream = response.GetResponseStream();
int sizeToRead = (int)response.ContentLength;
int sizeRead = 0;
int buffer = 1;
byte[] bytes = new byte[sizeToRead];
while (sizeToRead > 0)
{
int rs = sizeToRead > buffer ? buffer : sizeToRead;
stream.Read(bytes, sizeRead, rs);
sizeToRead -= rs;
sizeRead += rs;
}
stream.Close();
System.IO.File.WriteAllBytes("c:\\tmp\\b.mp3", bytes);
我有上面的代码。它的目的是从某个地方下载一个 mp3 文件并将其保存到 c:\tmp\filename。而且效果很好。
但是,如果我将缓冲区大小更改为不是 1 的值,例如 512。下载的 mp3 文件会很粗糙。我将我的程序下载的文件与通过浏览器下载的文件进行了比较,我发现我的程序下载的mp3文件的某些字节设置为0(它们的文件大小相同)。
另外,我在使用上述代码下载mp3文件时,还使用了fiddler来监控流量。我比较了从我的程序和浏览器下载的 mp3,所有的字节都是一样的。
所以,我想问题出在流阅读器或阅读过程中。有谁知道为什么会这样?以及如何在不将缓冲区大小设置为 1 的情况下解决它?
【问题讨论】:
-
既然已经创建了
new byte[sizeToRead],为什么还要使用循环,一次读取 1 (!) 个字节? -
为什么不直接使用
stream.ReadToEnd(),因为你在两次读取之间并没有真正做任何事情? -
仅供参考,您的 WebResponse 和 Stream 需要使用块:
using (HttpWebResponse response = (HttpWebResponse)request.GetResponse()){using (Stream stream = response.GetResponseStream()){int sizeToRead = (int)response.ContentLength; // ...}} -
@HenkHolterman 当我试图将缓冲区设置为 512 或更大时,我懒得重写它
-
@D Stanley 我不认为 Stream 有这种方法