我试图让这段代码更好一点.我怀疑它是一次读取一个字节的循环.我无法通过gzip解压缩找到另一种方法.实现a StreamReader
很好,但它返回一个我无法传递给解压缩流的字符串.
有没有更好的办法?
byte[] bufffer = null; ListresourceBytes = new List (); int byteValue = 0; WebResource resource = new WebResource(); HttpWebResponse webResponse = null; try { HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create(resourceUri); webRequest.Headers.Add(HttpRequestHeader.AcceptEncoding, "gzip,deflate"); webRequest.Headers.Add(HttpRequestHeader.AcceptCharset, "ISO-8859-1,utf-8;q=0.7,*;q=0.7"); webRequest.UserAgent = agent; webRequest.Accept = "text/html, application/xml;q=0.9, application/xhtml+xml, image/png, image/jpeg, image/gif, image/x-xbitmap, */*;q=0.1"; webRequest.Credentials = CredentialCache.DefaultCredentials; webRequest.Referer = resourceUri.OriginalString; webRequest.Timeout = 5000; webResponse = (HttpWebResponse)webRequest.GetResponse(); Stream webStream = webResponse.GetResponseStream(); if (!string.IsNullOrEmpty(webResponse.ContentEncoding)) { if (webResponse.ContentEncoding.ToLower().Contains("gzip")) { webStream = new GZipStream(webStream, CompressionMode.Decompress); } else if (webResponse.ContentEncoding.ToLower().Contains("deflate")) { webStream = new DeflateStream(webStream, CompressionMode.Decompress); } } do { byteValue = webStream.ReadByte(); if (byteValue != -1) { resourceBytes.Add((byte)byteValue); } } while (byteValue != -1); //Free up resources webStream.Close(); webResponse.Close(); bufffer = resourceBytes.ToArray();
Marc Gravell.. 9
我同意jmcd,WebClient会更简单,特别是WebClient.DownloadData.
实际的问题,问题是你正在读单个字节,当你应该有一个固定的缓冲区,并循环 - 即
int bytesRead; byte[] buffer = new byte[1024]; while((bytesRead = webStream.Read(buffer, 0, buffer.Length)) > 0) { // process "bytesRead" worth of data from "buffer" }
[编辑增加重点]重要的一点是你每次只处理"bytesRead"值的数据; 除此之外的一切都是垃圾.
我同意jmcd,WebClient会更简单,特别是WebClient.DownloadData.
实际的问题,问题是你正在读单个字节,当你应该有一个固定的缓冲区,并循环 - 即
int bytesRead; byte[] buffer = new byte[1024]; while((bytesRead = webStream.Read(buffer, 0, buffer.Length)) > 0) { // process "bytesRead" worth of data from "buffer" }
[编辑增加重点]重要的一点是你每次只处理"bytesRead"值的数据; 除此之外的一切都是垃圾.