043、URL 及多线程下载

Par @Martin dans le
Tags :

URL 网络编程

URL 编程

URL (Uniform Resource Locator) 中文名为统一资源定位符, 有时也被俗称为网页地址, 表示为互联网上的资源,如网页或者 FTP 地址.

URL可以分为如下几个部分: protocol://host:port/path?query#ref

在 java.net 包中定义了 URL 类和 URLConection 类使编程者方便地利用 URL 在 Internet 上进行网络通信

Reference: Java URL 处理

URL url = new URL("http://blog.smallcpp.cn/archives.html");

URLConnection uc = url.openConnection();
InputStream is = uc.getInputStream();
ByteArrayOutputStream bos = new ByteArrayOutputStream();

byte[] buffer = new byte[1024 * 8];
int len = 0;
while ((len = is.read(buffer)) != -1) {
    bos.write(buffer, 0, len);
}
System.out.println(bos.toString());
bos.close();
is.close();


处理 gzip 压缩的网页

ContentEncoding 为 text/html 或其他类似的文本直接打印出来就行, 如果网页是经过 gzip 压缩的话, 需要再转化一下.

上程序:

String url = "http://www.baidu.com";
URL cumtURL = new URL( url);
HttpURLConnection cumtConnection = (HttpURLConnection)cumtURL.openConnection();
cumtConnection.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9.2.13) Gecko/20101203 Firefox/3.6.13");
System.out.println(cumtConnection.getContentEncoding());
InputStream urlStream = new GZIPInputStream(cumtConnection.getInputStream());
BufferedReader reader = new BufferedReader(new InputStreamReader(urlStream,"gb2312"));
String line = "";
while((line = reader.readLine()) != null) {
    System.out.println(line);
}
reader.close();
urlStream.close();


多线程下载

关键就是 URLConnection 里有个 setRequestProperty 方法, 可以设置请求头的 Range 参数, 即指定指示文件的起始位置.

conn.setRequestProperty("Range", "bytes=" + startIndex + "-" + endIndex);