import java.io.File;

import java.io.InputStream;

import java.io.RandomAccessFile;

import java.net.HttpURLConnection;

import java.net.URL;

public class MulThreadDownload {

/**

* @param args

*/

public static void main(String[] args) {

String path = "http://net.itcast.cn/QQWubiSetup.exe";

try {

new MulThreadDownload().download(path, 3);

} catch (Exception e) {

e.printStackTrace();

}

}

/**

* 从路径中获取文件名称

* @param path 下载路径

* @return

*/

public static String getFilename(String path){

return path.substring(path.lastIndexOf('/')+1);

}

/**

* 下载文件

* @param path 下载路径

* @param threadsize 线程数

*/

public void download(String path, int threadsize) throws Exception{

URL url = new URL(path);

HttpURLConnection conn = (HttpURLConnection)url.openConnection();

conn.setRequestMethod("GET");

conn.setConnectTimeout(5 * 1000);

int filelength = conn.getContentLength();//获取要下载的文件的长度

String filename = getFilename(path);//从路径中获取文件名称

File saveFile = new File(filename);

RandomAccessFile accessFile = new RandomAccessFile(saveFile, "rwd");

accessFile.setLength(filelength);//设置本地文件的长度和下载文件相同

accessFile.close();

//计算每条线程下载的数据长度

int block = filelength%threadsize==0? filelength/threadsize : filelength/threadsize+1;

for(int threadid=0 ; threadid < threadsize ; threadid++){

new DownloadThread(url, saveFile, block, threadid).start();

}

}

private final class DownloadThread extends Thread{

private URL url;

private File saveFile;

private int block;//每条线程下载的数据长度

private int threadid;//线程id

public DownloadThread(URL url, File saveFile, int block, int threadid) {

this.url = url;

this.saveFile = saveFile;

this.block = block;

this.threadid = threadid;

}

@Override

public void run() {

//计算开始位置公式:线程id*每条线程下载的数据长度= ?

//计算结束位置公式:(线程id +1)*每条线程下载的数据长度-1 =?

int startposition = threadid * block;

int endposition = (threadid + 1 ) * block - 1;

try {

RandomAccessFile accessFile = new RandomAccessFile(saveFile, "rwd");

accessFile.seek(startposition);//设置从什么位置开始写入数据

HttpURLConnection conn = (HttpURLConnection)url.openConnection();

conn.setRequestMethod("GET");

conn.setConnectTimeout(5 * 1000);

conn.setRequestProperty("Range", "bytes="+ startposition+ "-"+ endposition);

InputStream inStream = conn.getInputStream();

byte[] buffer = new byte[1024];

int len = 0;

while( (len=inStream.read(buffer)) != -1 ){

accessFile.write(buffer, 0, len);

}

inStream.close();

accessFile.close();

System.out.println("线程id:"+ threadid+ "下载完成");

} catch (Exception e) {

e.printStackTrace();

}

}

}

}



已有 0 人发表留言,猛击->> 这里<<-参与讨论


ITeye推荐
  • —软件人才免语言低担保 赴美带薪读研!—



更多相关文章

  1. android 线程方式打印log到sd卡
  2. 线程
  3. Android在子线程中更新UI的方法汇总(共七种)
  4. TextView 的设置现实的文字的长度?
  5. Android 功耗优化(5)---Android O 的Doze模式白名单路径
  6. android学习笔记----多线程断点续传下载原理设计
  7. Android线程间通信的Message机制
  8. 如何正确获得Android内外SD卡路径

随机推荐

  1. 实习杂记(20)---Android里面shape定义图形
  2. android设置在ListView中让TextView滚动
  3. android锁屏唤醒并解锁屏幕
  4. android 设置textview 边框
  5. 2011.06.22——— android framelayout布
  6. Android基础知识大纲
  7. Android(安卓)EditText样式
  8. android录制更大视频文件的修改
  9. ImageView的属性android:scaleType
  10. android 实现根据receiver的注册状态 进