package com.test;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.RandomAccessFile;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.ProtocolException;
import java.net.URL;
public class DownLoadUtil {
private String urlStr;
private String targetFile;
private int threadNum;
private DownloadThread[] threads;
private int fileSize;
public DownLoadUtil(String urlStr, String targetFile, int threadNum) {
this.urlStr = urlStr;
this.targetFile = targetFile;
this.threadNum = threadNum;
this.threads = new DownloadThread[threadNum];
}
public void download() {
try {
HttpURLConnection conn = this.getHttpURLConnection();
conn.setRequestProperty("Connection", "Keep-Alive");
fileSize = conn.getContentLength();
conn.disconnect();
int currentPartSize = fileSize/threadNum + 1;
RandomAccessFile file = new RandomAccessFile(targetFile, "rw");
file.setLength(fileSize);
file.close();
for(int i=0; i<threadNum; i++) {
int startPosition = currentPartSize * i;
RandomAccessFile currentFile = new RandomAccessFile(targetFile, "rw");
currentFile.seek(startPosition);
threads[i] = new DownloadThread(startPosition, currentFile, currentPartSize);
new Thread(threads[i]).start();
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
private class DownloadThread implements Runnable {
private int startPosition;
private RandomAccessFile downloadFile;
private int currentPartSize;
private int hasDownSize;
public DownloadThread(int startPosition, RandomAccessFile downloadFile,
int currentPartSize) {
this.startPosition = startPosition;
this.downloadFile = downloadFile;
this.currentPartSize = currentPartSize;
}
@Override
public void run() {
try {
HttpURLConnection conn = getHttpURLConnection();
InputStream in = conn.getInputStream();
in.skip(this.startPosition);
byte[] buffer = new byte[1024];
int hasRead = 0;
while (hasDownSize < currentPartSize &&
(hasRead = in.read(buffer)) != -1) {
downloadFile.write(buffer, 0, hasRead);
hasDownSize += hasRead;
}
downloadFile.close();
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
private HttpURLConnection getHttpURLConnection() {
HttpURLConnection conn = null;
try {
URL url = new URL(urlStr);
conn = (HttpURLConnection) url.openConnection();
conn.setConnectTimeout(5 * 1000);
conn.setRequestMethod("GET");
conn.setRequestProperty(
"Accept",
"image/gif, image/jpeg, image/pjpeg, image/pjpeg, "
+ "application/x-shockwave-flash, application/xaml+xml, "
+ "application/vnd.ms-xpsdocument, application/x-ms-xbap, "
+ "application/x-ms-application, application/vnd.ms-excel, "
+ "application/vnd.ms-powerpoint, application/msword, */*");
conn.setRequestProperty("Accept-Language", "zh-CN");
conn.setRequestProperty("Charset", "UTF-8");
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (ProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return conn;
}
}
分享到:
相关推荐
java多线程模拟队列实现排队叫号,多线程模拟排队叫号取号 java多线程模拟队列实现排队叫号,多线程模拟排队叫号取号
java多线程下载器,可以用java实现多线程下载功能
Java多线程实现异步调用实例。运行Main可以看到结果。main是主线程,另有A,B,C三个线程用不同的时间跑完。
刚学完多线程和线程池,以及线程爱好者。 使用场景及目标: 大文件的快速下载,经测试在100M带宽的网络下,下载一个40M的文件,不超过两秒钟,当然还得根据自己电脑的配置来讲。 其他说明: 文件如果特别小,而...
Java多线程读大文件 java多线程写文件:多线程往队列中写入数据
java多线程实现大批量数据切分成指定份数的数据,然后多线程处理入库或者导出,线程的个数和每份数据的数量都可以控制
用java实现多线程下载,可以学习参考呵呵
java一些简单的多线程用法,适合初学者
java多线程实现TCP连接UDP聊天的聊天程序
采用apache commons开发包,实现了FTP多线程下载,并有简单的包括进度条的界面,代码的运行:1 把自己的PC配置成FTP服务器(只需下载Serc-U软件)2 建立用户,用户名:zhangyu,密码:123,设置根目录,并拷贝进一些...
适合初学者使用,Java多线程技术实现矩阵乘积计算
java实现多线程下载文件功能,通过线程池管理,实现下载文件速度快,安全。
Java多线程实现数据切割批量执行,实现限流操作。 java线程池Executors实现数据批量操作。 批量异步Executors处理数据,实现限流操作,QPS限流。 线程池调用第三方接口限流实现逻辑。 案例适合: 1.批量处理大数据。...
java多线程断点下载文件 ,文档介绍及代码实现
Java多线程实现.pdf
该文档总结了Java多线程相关的知识点,分享给大家,简单易懂!
java多线程实现生产者和消费者
java多线程实现一个控制台聊天室 java多线程实现一个控制台聊天室
用java平台利用java的多线程特点,编写进度条的现实以及当前时间的实时更新。