目前不支持断点续传,主要有以下两个类实现:
1.线程类:DownloadThread .java
import java.io.IOException;
import java.io.InputStream;
import java.io.RandomAccessFile;
import java.net.HttpURLConnection;
import java.net.URL;
public class DownloadThread extends Thread{
private InputStream randIn;
private RandomAccessFile randOut;
private URL url;
private long block;
private int threadId=-1;
private boolean done=false;
public DownloadThread(URL url,RandomAccessFile out,long block,int threadId)
{
this.url=url;
this.randOut=out;
this.block=block;
this.threadId=threadId;
}
public void run()
{
try{
HttpURLConnection http=(HttpURLConnection)url.openConnection();
http.setRequestProperty("Range","bytes="+block*(threadId-1)+"-");
randIn=http.getInputStream();
}
catch(IOException e){
System.err.println(e);
}
byte [] buffer=new byte[1024];
int offset=0;
long localSize=0;
System.out.println("线程"+threadId+"开始下载");
try {
while ((offset = randIn.read(buffer)) != -1&&localSize<=block) {
randOut.write(buffer,0,offset);
localSize+=offset;
}
randOut.close();
randIn.close();
done=true;
System.out.println("线程"+threadId+"完成下载");
this.interrupt();
}
catch(Exception e){
System.err.println(e);
}
}
public boolean isFinished(){
return done;
}
}
2.使用多线程下载:
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
public class DownloadMultiThread {
private File fileOut;
private URL url;
private long fileLength=0;
//初始化线程数
private int ThreadNum=1;
public DownloadMultiThread(String urlString)
{
try
{
System.out.println("正在链接URL:" + urlString);
url=new URL(urlString);
HttpURLConnection urlcon=(HttpURLConnection)url.openConnection();
fileLength=urlcon.getContentLength();
if(urlcon.getResponseCode()>=400)
{
System.out.println("服务器响应错误!");
System.exit(-1);
}
if(fileLength<=0)
System.out.println("无法获知文件大小");
System.out.println("文件大小为"+fileLength/1024+"K");
//获取文件名
ThreadNum = (int) (fileLength/(1024*5) + 1);
if(ThreadNum>=10)ThreadNum=10;
String trueurl=urlcon.getURL().toString();
String filename=trueurl.substring(trueurl.lastIndexOf('/')+1);
fileOut=new File("D://",filename);
}
catch(MalformedURLException e){
System.err.println(e);
}
catch(IOException e){
System.err.println(e);
}
init();
}
private void init(){
DownloadThread [] down=new DownloadThread[ThreadNum];
try {
for(int i=0;i<ThreadNum;i++){
RandomAccessFile randOut=new RandomAccessFile(fileOut,"rw");
randOut.setLength(fileLength);
long block=fileLength/ThreadNum+1;
randOut.seek(block*i);
down[i]=new DownloadThread(url,randOut,block,i+1);
down[i].setPriority(7);
down[i].start();
}
//循环判断是否下载完毕
boolean flag=true;
while (flag) {
Thread.sleep(100);
flag = false;
for (int i = 0; i < ThreadNum; i++)
if (!down[i].isFinished()) {
flag = true;
break;
}
System.out.println("文件下载完毕,保存在:"+fileOut.getPath() );
} catch (FileNotFoundException e) {
System.err.println(e);
e.printStackTrace();
}
catch(IOException e){
System.err.println(e);
e.printStackTrace();
}
catch (InterruptedException e) {
System.err.println(e);
}
}
public static void main(String[] args) {
new DownloadMultiThread("http://www.baidu.com/img/baidu_logo.gif");
System.out.println("baidu finish!");
}
}
posted on 2008-09-21 11:50
胖胖泡泡 阅读(1471)
评论(0) 编辑 收藏