package test;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.RandomAccessFile;
import java.net.HttpURLConnection;
import java.net.ProtocolException;
import java.net.URI;
import java.net.URL;
import java.util.Random;
/**
*
* 实现了下载的功能*/
public class SimpleTh {
public static void main(String[] args){
// TODO Auto-generated method stub
//String path = "http://www.7cd.cn/QingTengPics/倩女幽魂.mp3";//MP3下载的地址
//String path ="http://img.99luna.com/music/%CF%EB%C4%E3%BE%CD%D0%B4%D0%C5.mp3";
//String path = "http://localhost:8080/download/res/MPASetup.msi";
String path = "http://localhost:8080/download/res/abc.gif";
try {
new SimpleTh().download(path, 3); //对象调用下载的方法
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static String getFilename(String path){//获得文件的名字
return path.substring(path.lastIndexOf('/')+1);
}
public void download(String path,int threadsize) throws Exception//下载的方法
{//参数 下载地址,线程数量
URL url = new URL(path);
HttpURLConnection conn = (HttpURLConnection)url.openConnection();//获取HttpURLConnection对象
conn.setRequestMethod("GET");//设置请求格式,这里是GET格式
conn.setReadTimeout(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 {
try {
RandomAccessFile accessFile = new RandomAccessFile(saveFile, "rwd");
accessFile.seek(startposition);//设置从什么位置写入数据
HttpURLConnection conn = (HttpURLConnection)url.openConnection();
conn.setRequestMethod("GET");
conn.setReadTimeout(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+"下载完成");
System.out.println("length"+accessFile);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
6 个解决方案
#1
自顶,不要沉啊!
#2
没玩过 不清楚 绑定 貌似 web
开发 不用这个
开发 不用这个
#3
416 Requested Range Not Satisfiable
Range范围不匹配。
这里:
for(int threadid = 0;threadid<=threadsize;threadid++){
似乎应该是:
for(int threadid = 0;threadid<threadsize;threadid++){
#4
确实是这个问题!高手啊!谢谢了!
这个下载完成后,资源放到哪儿了
#5
new File(filename)
如果filename没指定绝对路径,默认使用的路径就是:
System.getProperty("user.dir") + "/" + filename
你这里就是项目的路径下。
#6
顶
#7
#1
自顶,不要沉啊!
#2
没玩过 不清楚 绑定 貌似 web
开发 不用这个
开发 不用这个
#3
416 Requested Range Not Satisfiable
Range范围不匹配。
这里:
for(int threadid = 0;threadid<=threadsize;threadid++){
似乎应该是:
for(int threadid = 0;threadid<threadsize;threadid++){
#4
确实是这个问题!高手啊!谢谢了!
这个下载完成后,资源放到哪儿了
#5
new File(filename)
如果filename没指定绝对路径,默认使用的路径就是:
System.getProperty("user.dir") + "/" + filename
你这里就是项目的路径下。
#6
顶