GlobalGet”是实现HTTP协议和FTP协议的多线程下载工具。目前公司承担其测试版本的开发。该工具需要具备多线程分段下载的功能,同时还应实现“断点续传”功能。后续的版本还将增加下载资料管理的功能 。
[size=x-large]运行效果如下:[/size]
[img]http://dl.iteye.com/upload/attachment/154344/e91940ac-63da-3464-b8ea-0bbdbcda2c75.bmp[/img]
实现代码:
[size=x-large]运行效果如下:[/size]
[img]http://dl.iteye.com/upload/attachment/154344/e91940ac-63da-3464-b8ea-0bbdbcda2c75.bmp[/img]
实现代码:
package org.nitpro.demo;
import java.net.HttpURLConnection;
import java.net.URL;
public class DownloadUtil {
public int getFileLength(String url) throws Exception{
int length = 0;
URL downladURL = new URL(url);
HttpURLConnection con = (HttpURLConnection) downladURL.openConnection();
int stateCode = con.getResponseCode();
if (stateCode != 200) {
length = -1;
}
int size = con.getContentLength();
con.disconnect();
length = size;
return length;
}
public boolean isFinished(boolean[] isStop){
boolean isFinished = false;
for(int i=0;i<isStop.length;){
boolean flag = isStop[i];
if(!flag){
try{
Thread.sleep(3000);
}catch(Exception e){
e.printStackTrace();
}
isFinished = false;
}else{
isFinished = true;
i++;
}
}
return true;
}
}
package org.nitpro.demo;
public class DownloadInfo {
String url;
int threadNum;
String filename;
public String getFilename() {
return filename;
}
public void setFilename(String filename) {
this.filename = filename;
}
public int getThreadNum() {
return threadNum;
}
public void setThreadNum(int threadNum) {
this.threadNum = threadNum;
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
}
package org.nitpro.demo;
import java.util.List;
import java.io.File;
import java.io.FileInputStream;
import java.io.RandomAccessFile;
public class MultiDownload {
int i=0;
int fileMark = 0;
DownloadUtil downUtil = new DownloadUtil();
boolean isStop[] = new boolean[10];
public void downProcess(String url,int byteCount,int threadNum) throws Exception{
while(i<threadNum){
final int startPosition = byteCount*i;
final int endPosition = byteCount*(i+1);
File file = new File("temp_file_"+i+".temp");
DownThread fileThread = new DownThread(url,file,
startPosition,endPosition,this,i);
new Thread(fileThread).start();
i++;
}
}
public void downMulitFile(List downList) throws Exception{
for(int k=0;k<downList.size();k++){
DownloadInfo downInfo = (DownloadInfo)downList.get(i);
String url = downInfo.getUrl();
int threadNum = downInfo.getThreadNum();
String filename = downInfo.getFilename();
int fileLength = downUtil.getFileLength(url);
if(fileLength!=-1){
final int byteCount = (int)(fileLength/threadNum)+1;
boolean stopFlag = true;
downProcess(url,byteCount,threadNum);
stopFlag = downUtil.isFinished(isStop);
if(stopFlag){
File file = new File(filename);
uniteFile(threadNum,file);
}
}
}
}
public void uniteFile(int threadNum,File file) throws Exception{
for(int i=0;i<threadNum;i++){
File tempfile = new File("temp_file_"+i+".temp");
FileInputStream fis = new FileInputStream(tempfile);
RandomAccessFile raf = new RandomAccessFile(file, "rw");
byte[] buf = new byte[1024];
int len = -1;
raf.seek((long) fileMark);
while ((len = fis.read(buf)) != -1) {
raf.write(buf, 0, len);
fileMark += len;
}
fis.close();
raf.close();
tempfile.delete();
}
}
}
package org.nitpro.demo;
import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
public class DownThread implements Runnable{
String url = "";
File file;
int startPosition;
int endPosition;
MultiDownload down;
int i;
public DownThread(String url,File file,int startPosition,int endPosition,MultiDownload down,int i){
this.url = url;
this.file = file;
this.startPosition = startPosition;
this.endPosition = endPosition;
this.down = down;
this.i = i;
}
public void run(){
try{
URL downUrl = new URL(url);
HttpURLConnection connection = (HttpURLConnection)downUrl.openConnection();
InputStream is = connection.getInputStream();
BufferedInputStream bis = new BufferedInputStream(is);
FileOutputStream out = new FileOutputStream(file);
byte buf[] = new byte[1024];
int size = -1;
int count = 0;
bis.skip(startPosition+1);
while ((size = bis.read(buf, 0, 1024)) > 0) {
if ((startPosition + size) >= endPosition)
size = endPosition - startPosition;
out.write(buf, 0, size);
startPosition += size;
count += size;
}
bis.close();
out.close();
connection.disconnect();
}catch(Exception e){
e.printStackTrace();
}
down.isStop[i] = true;
}
}
package org.nitpro.demo;
import java.util.ArrayList;
import java.util.List;
public class Demo {
public void start() throws Exception{
MultiDownload down = new MultiDownload();
String url = "http://www.ytblog.net/blog_musfile/823996700.mp3 ";
int threadNum = 3;
String filename = "save_as_filename.mp3";
DownloadInfo info = new DownloadInfo();
info.setUrl(url);
info.setThreadNum(threadNum);
info.setFilename(filename);
List downlist = new ArrayList();
downlist.add(info);
down.downMulitFile(downlist);
}
public static void main(String[] args){
try{
Demo demo = new Demo();
demo.start();
}catch(Exception e){
e.printStackTrace();
}
}
}