Android/Java多线程下载

来源:互联网 发布:淘宝上我的店铺去哪找 编辑:程序博客网 时间:2024/05/19 12:39
package com.lipeng.download;import java.io.File;import java.io.InputStream;import java.io.RandomAccessFile;import java.net.HttpURLConnection;import java.net.URL;/** * 多线程下载 * @author Dell */public class MulThreadDownload {public static void main(String[] args) {String path = "http://192.168.188.1:8080/test/FeiQ.exe"; int threadSize = 3;try {new MulThreadDownload().download(path, threadSize);} catch (Exception e) {e.printStackTrace();}}/** * 下载文件 * @param path 下载路径 * @param threadSize 线程个数 * @throws Exception */private void download(String path, int threadSize) throws Exception {URL url = new URL(path);HttpURLConnection conn = (HttpURLConnection) url.openConnection();conn.setConnectTimeout(5000);conn.setRequestMethod("GET");if(conn.getResponseCode() == 200){int contentLength = conn.getContentLength();// 获取下载文件的内容长度File file = new File(getFileName(path));// rwd方式:打开以便读取和写入,对于 "rw",还要求对文件内容的每个更新都同步写入到底层存储设备。 // Android 程序要使用rwd方式,防止文件丢失RandomAccessFile randomAccessFile = new RandomAccessFile(file, "rwd");randomAccessFile.setLength(contentLength);// 设置该文件的长度等于下载文件的长度randomAccessFile.close();int block = contentLength%threadSize==0 ? contentLength/threadSize : contentLength/threadSize + 1;// 设置每个县城下载的数量for(int threadId=0; threadId<threadSize; threadId++){DownloadThread thread = new DownloadThread(threadId, block, url, file);thread.start();}} else {System.out.println("下载失败");}}private class DownloadThread extends Thread{private int threadId;private int block; private URL url;private File file;/** * @param threadId 线程ID * @param block 每个线程下载数据量 * @param url 下载路径 * @param file 下载存放文件 */public DownloadThread(int threadId, int block, URL url, File file){this.threadId = threadId;this.block = block;this.url = url;this.file = file;}@Overridepublic void run() {int startLocation = threadId * block;// 从网络文件的开始下载位置int endLocation = (threadId + 1) * block - 1;// 到网络文件下载的结束位置try {RandomAccessFile randomAccessFile = new RandomAccessFile(file, "rwd");randomAccessFile.seek(startLocation);HttpURLConnection conn = (HttpURLConnection) url.openConnection();conn.setConnectTimeout(5000);conn.setRequestMethod("GET");conn.setRequestProperty("Range", "bytes=" + startLocation + "-" + endLocation);// 写入文件InputStream in = conn.getInputStream();int len;byte[] buffer = new byte[1024];while((len=in.read(buffer)) != -1){randomAccessFile.write(buffer, 0, len);}randomAccessFile.close();in.close();System.out.println("第" + (threadId + 1) + "线程下载完成");} catch (Exception e) {e.printStackTrace();}}}/** * 获取文件名称 * @param path * @return */private String getFileName(String path) {if(path != null && !"".equals(path)){return path.substring((path.lastIndexOf("/") + 1));}return null;}}

0 0
原创粉丝点击