class UsingStreamUtilWithExtensions
{
static void Main()
{
WebRequest request = WebRequest.Create("http://manning.com");
using (WebResponse response = request.GetResponse())
using (Stream responseStream = response.GetResponseStream())
using (FileStream output = File.Create("response.dat"))
{
responseStream.CopyTo(output);
//编译器已将CopyTo调用转换成对普通静态方法StreamUtil.CopyTo
//的调用。调用时,会将responseStream的值作为第一个实参的
//值传递(然后是output)
}
}
}
public static class StreamUtilWithExtensions
{
const int BufferSize = 8192;
public static void CopyTo(this Stream input,
Stream output)
{
byte[] buffer = new byte[BufferSize];
int read;
while ((read = input.Read(buffer, 0, buffer.Length)) > 0)
{//当读不到时退出循环
output.Write(buffer, 0, read);
}
}
public static byte[] ReadFully(this Stream input)
{
using (MemoryStream tempStream = new MemoryStream())
{
CopyTo(input, tempStream);
if (tempStream.Length == tempStream.GetBuffer().Length)
{
return tempStream.GetBuffer();
}
return tempStream.ToArray();
}
}
}
表面上看起来是让响应流执行复制操作。其实仍然是StreamUtil在幕后做这件
事情。
输出
response.dat 231kb