读取网页内容,返回字符串,大家看看下面的程序,有何改进的地方,注意“假设”。    // 假设:
    // 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.   

    有标准的方法就是用标准的,为何要自己再封装一次。
    s.ReadToEnd();
      

  2.   


    呵呵,不合要求,我那只是一个模型,肯定是 ReadToEnd() 不能解决的。
      

  3.   

    就这样凑合吧:    private static byte[] getBytes(string url)
        {
            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;
        }