要求:从网页上读取数据,然后写入本地文件。
这段代码是通过一个url地址读取网页中的文本数据。没有写入文件,直接返回文本字符串。
public
static
String getPageContent(String url)
... {
String content = "";
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
Stream stream = response.GetResponseStream();
StreamReader sr = new StreamReader(stream);
content = sr.ReadToEnd();
sr.Close();
response.Close();
return content;
}
... {
String content = "";
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
Stream stream = response.GetResponseStream();
StreamReader sr = new StreamReader(stream);
content = sr.ReadToEnd();
sr.Close();
response.Close();
return content;
}
确实能够读取网页。
但我想读取一幅图像,也通过这种方式读取数据,结果调试了半天,一直不得行。后来发现是StreamReader 的问题。通过StreamReader 是以特定的编码读取字符,而我写文件是以字节流的方式写的。那这样,我的操作过程就是,先以字符方式读取,字符转化成字节,然后以字符流方式写。过程繁多,而且字符/字节间的转化涉及编码问题,几乎就是错误的做法。
应该以字节流(BinaryReader)读,以字节流写。如下:
/**/
/**
* 根据一个url地址下载web资源
*/
public static void downloadWebResource(String url, String filename)
... {
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
Stream readStream = response.GetResponseStream();
BinaryReader streamReader = new BinaryReader(readStream);
FileInfo file = new FileInfo(filename);
FileStream saveStream = file.Create();
while(true)
...{
int bufferLen=1024;
byte[] buffer = new byte[bufferLen];
int rdLen = streamReader.Read(buffer, 0, bufferLen);
saveStream.Write(buffer, 0, rdLen);
saveStream.Flush();
if (rdLen == 0 )
break;
}
saveStream.Close();
streamReader.Close();
response.Close();
}
* 根据一个url地址下载web资源
*/
public static void downloadWebResource(String url, String filename)
... {
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
Stream readStream = response.GetResponseStream();
BinaryReader streamReader = new BinaryReader(readStream);
FileInfo file = new FileInfo(filename);
FileStream saveStream = file.Create();
while(true)
...{
int bufferLen=1024;
byte[] buffer = new byte[bufferLen];
int rdLen = streamReader.Read(buffer, 0, bufferLen);
saveStream.Write(buffer, 0, rdLen);
saveStream.Flush();
if (rdLen == 0 )
break;
}
saveStream.Close();
streamReader.Close();
response.Close();
}
ok,顺利通过测试。