- import java.io.File;
- import java.io.FileNotFoundException;
- import java.io.InputStream;
- import java.io.RandomAccessFile;
- import java.net.HttpURLConnection;
- import java.net.URL;
- public class Main {
- /**
- * @param args
- * @throws Exception
- */
- public static void main(String[] args) throws Exception {
- new Main().download("http://gdown.baidu.com/data/wisegame/a3d96bf8e8a5102c/baiduliulanqi_25.apk", 5);
- }
- public void download(String downPath, int threadNum) throws Exception{
- URL url = new URL(downPath);
- HttpURLConnection conn = (HttpURLConnection) url.openConnection();
- conn.setConnectTimeout(5000);
- conn.setRequestMethod("GET");
- //InputStream in = conn.getInputStream();
- if(conn.getResponseCode() == 200){
- int size = conn.getContentLength();
- File file = new File(downPath.substring(downPath.lastIndexOf("/")+1));
- //"rwd" 会立刻把数据同步到设备上,防止手机没电数据丢失
- RandomAccessFile raf = new RandomAccessFile(file, "rwd");
- raf.setLength(size); //暂时还没数据
- raf.close();
- int block = size%threadNum == 0 ? size/threadNum : size/threadNum + 1;
- for(int i=0; i<threadNum; i++){
- new DownThread(i, block, url, file).start();
- }
- }else{
- System.out.println("下载失败");
- }
- }
- //下载线程类
- private class DownThread extends Thread{
- private int id;
- private int block; //每个线程下载块大小
- private URL url; //地址
- private File file; //下载保存在哪个文件
- public DownThread(int i, int block, URL url, File file) {
- this.id = i;
- this.block = block;
- this.url = url;
- this.file = file;
- }
- public void run(){
- int start = id * block;
- int end = (id+1) * block - 1;
- try {
- RandomAccessFile raf = new RandomAccessFile(file, "rwd");
- raf.seek(start);
- HttpURLConnection conn = (HttpURLConnection) url.openConnection();
- conn.setConnectTimeout(5000);
- conn.setRequestMethod("GET");
- //通过头字段,指定获取文件的位置 bytes="1-1000"
- conn.setRequestProperty("Range", "bytes=" + start + "-" + end);
- //分段请求文件时,返回码是206
- if(conn.getResponseCode() == 206){
- byte[] buffer = new byte[1024];
- InputStream in = conn.getInputStream();
- int len = 0;
- while( (len=in.read(buffer)) != -1){
- raf.write(buffer, 0, len);
- }
- raf.close();
- in.close();
- System.out.println("线程:" + id + "下载完成");
- }else{
- System.out.println("失败");
- }
- } catch (Exception e) {
- e.printStackTrace();
- }
- System.out.println("");
- }
- }
- }
- import java.io.File;
- import java.io.FileNotFoundException;
- import java.io.InputStream;
- import java.io.RandomAccessFile;
- import java.net.HttpURLConnection;
- import java.net.URL;
- public class Main {
- /**
- * @param args
- * @throws Exception
- */
- public static void main(String[] args) throws Exception {
- new Main().download("http://gdown.baidu.com/data/wisegame/a3d96bf8e8a5102c/baiduliulanqi_25.apk", 5);
- }
- public void download(String downPath, int threadNum) throws Exception{
- URL url = new URL(downPath);
- HttpURLConnection conn = (HttpURLConnection) url.openConnection();
- conn.setConnectTimeout(5000);
- conn.setRequestMethod("GET");
- //InputStream in = conn.getInputStream();
- if(conn.getResponseCode() == 200){
- int size = conn.getContentLength();
- File file = new File(downPath.substring(downPath.lastIndexOf("/")+1));
- //"rwd" 会立刻把数据同步到设备上,防止手机没电数据丢失
- RandomAccessFile raf = new RandomAccessFile(file, "rwd");
- raf.setLength(size); //暂时还没数据
- raf.close();
- int block = size%threadNum == 0 ? size/threadNum : size/threadNum + 1;
- for(int i=0; i<threadNum; i++){
- new DownThread(i, block, url, file).start();
- }
- }else{
- System.out.println("下载失败");
- }
- }
- //下载线程类
- private class DownThread extends Thread{
- private int id;
- private int block; //每个线程下载块大小
- private URL url; //地址
- private File file; //下载保存在哪个文件
- public DownThread(int i, int block, URL url, File file) {
- this.id = i;
- this.block = block;
- this.url = url;
- this.file = file;
- }
- public void run(){
- int start = id * block;
- int end = (id+1) * block - 1;
- try {
- RandomAccessFile raf = new RandomAccessFile(file, "rwd");
- raf.seek(start);
- HttpURLConnection conn = (HttpURLConnection) url.openConnection();
- conn.setConnectTimeout(5000);
- conn.setRequestMethod("GET");
- //通过头字段,指定获取文件的位置 bytes="1-1000"
- conn.setRequestProperty("Range", "bytes=" + start + "-" + end);
- //分段请求文件时,返回码是206
- if(conn.getResponseCode() == 206){
- byte[] buffer = new byte[1024];
- InputStream in = conn.getInputStream();
- int len = 0;
- while( (len=in.read(buffer)) != -1){
- raf.write(buffer, 0, len);
- }
- raf.close();
- in.close();
- System.out.println("线程:" + id + "下载完成");
- }else{
- System.out.println("失败");
- }
- } catch (Exception e) {
- e.printStackTrace();
- }
- System.out.println("");
- }
- }
- }