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(安卓)Cache Partition
  2. Android(安卓)Service学习之IntentService 深入分析
  3. WebView.onDraw (Android(安卓)4.1)
  4. Android根据URL下载文件保存到SD卡
  5. android 线程方式打印log到sd卡
  6. android Thread和Runnable的区别
  7. Android(安卓)apps应用检查更新代码
  8. Android(安卓)Studio 1.0正式稳定版下载地址
  9. Android的GLSurfaceView测试源码

随机推荐

  1. Android 防止启动页面(SplashActivity)被
  2. Android截取开机关机事件
  3. Android根据上下文对象Context找到对应的
  4. android NDK 各个版本下载地址
  5. [android]android的容器、控件
  6. Android中的AsyncTask
  7. Android(安卓)Studio重构之路,我们重新来
  8. android 布局属性
  9. 居中对齐
  10. Android Contextual Menus之二:contextual