读取网页内容,返回字符串,大家看看下面的程序,有何改进的地方,注意“假设”。 // 假设:
// 1、多次读数据到 Byte 数组(不知道数据量有多大)
// 2、由 Byte数组 获取“字符串”结果
// 3、必须完整得到 Byte数组 后才能执行(2)
private static string getHtml(string url)
{
int c = 1024 * 40;
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
Stream s = response.GetResponseStream();
byte []data=new byte[0]; // 存放读取的所有数据
byte[] buffer = new byte[c]; // 读数据缓冲区
int l = s.Read(buffer, 0, c); // 一次读 10K
while(l>0)
{
byte[]temp=new byte[data.Length + l]; // 临时 Byte数组
Array.Copy(data, 0, temp, 0, data.Length); // 将 data 原有值复制到 temp 中
Array.Copy(buffer, 0, temp, data.Length, l);// 将 buffer 复制到 temp 中
data = temp; // 新的 data 数组
l = s.Read(buffer, 0, c); // 继续读数据
}
s.Close();
response.Close();
return Encoding.Default.GetString(data); // 返回字符串
}
// 1、多次读数据到 Byte 数组(不知道数据量有多大)
// 2、由 Byte数组 获取“字符串”结果
// 3、必须完整得到 Byte数组 后才能执行(2)
private static string getHtml(string url)
{
int c = 1024 * 40;
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
Stream s = response.GetResponseStream();
byte []data=new byte[0]; // 存放读取的所有数据
byte[] buffer = new byte[c]; // 读数据缓冲区
int l = s.Read(buffer, 0, c); // 一次读 10K
while(l>0)
{
byte[]temp=new byte[data.Length + l]; // 临时 Byte数组
Array.Copy(data, 0, temp, 0, data.Length); // 将 data 原有值复制到 temp 中
Array.Copy(buffer, 0, temp, data.Length, l);// 将 buffer 复制到 temp 中
data = temp; // 新的 data 数组
l = s.Read(buffer, 0, c); // 继续读数据
}
s.Close();
response.Close();
return Encoding.Default.GetString(data); // 返回字符串
}
s.ReadToEnd();
呵呵,不合要求,我那只是一个模型,肯定是 ReadToEnd() 不能解决的。
{
int c = 1024 * 100;
byte[] data = null;
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
request.Referer = url;
request.Headers[HttpRequestHeader.AcceptEncoding] = "gzip, deflate";
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
string ce = response.Headers[HttpResponseHeader.ContentEncoding];
int ContentLength = (int)response.ContentLength;
Stream s = response.GetResponseStream();
if (ContentLength < 0)
{
int pos = 0, cc = c;
byte[] buffer = new byte[c];
int l = s.Read(buffer, pos, cc);
while (l > 0)
{
Console.WriteLine("1--> " + l);
pos += l;
cc -= l;
if (cc == 0)
{
Console.WriteLine("\n重新分配内存...");
byte[] temp = new byte[buffer.Length + c]; // 临时 Byte数组
Array.Copy(buffer, temp, pos); // 将 buffer 复制到 temp 中
buffer = temp; // 新的 buffer 数组
cc += c;
}
l = s.Read(buffer, pos, cc); // 继续读数据
}
data = new byte[pos];
Array.Copy(buffer, data, pos);
}
else
{
data = new byte[ContentLength];
int pos = 0;
while (ContentLength > 0)
{
int l = s.Read(data, pos, ContentLength);
pos += l;
ContentLength -= l;
Console.WriteLine("2--> " + l);
}
}
s.Close();
response.Close(); if (ce == "gzip")
{
Console.WriteLine("\n\n正在解压数据...");
MemoryStream ms = new MemoryStream(data);
GZipStream g = new GZipStream(ms, CompressionMode.Decompress);
byte[] d = new byte[0];
byte[] buffer = new byte[c]; // 读数据缓冲区
int l = g.Read(buffer, 0, c); // 一次读 10K
while (l > 0)
{
Console.WriteLine("3--> " + l);
byte[] temp = new byte[d.Length + l]; // 临时 Byte数组
Array.Copy(d, 0, temp, 0, d.Length); // 将 data 原有值复制到 temp 中
Array.Copy(buffer, 0, temp, d.Length, l); // 将 buffer 复制到 temp 中
d = temp; // 新的 data 数组
l = g.Read(buffer, 0, c); // 继续读数据
}
g.Close();
ms.Close();
data = d;
}
return data;
}