package downutil;
import java.net.URL;
import java.util.RandomAccess;
import java.io.RandomAccessFile;
import java.io.Serializable;
import java.net.HttpURLConnection;
public class DownUtil {
private DownThread[] threads;
private String path;
private String targetFile;
private int threadNum;
private int fileSize;
private long startPos;
private int currentPartSize;
private RandomAccessFile currentPart;
public DownUtil(String path,String targetFile,int threadNum) {
this.path=path;
this.threadNum=threadNum;
threads = new DownThread[threadNum];
this.targetFile=targetFile;
}
public void download()throws Exception{
URL url=new URL(path);
HttpURLConnection 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-falsh,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");
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 startPos=i*currentPartSize;
RandomAccessFile currentPart=new RandomAccessFile(targetFile,"rw");
currentPart.seek(startPos);;
threads[i]= new DownThread(startPos, currentPartSize,currentPart);
threads[i].start();
}
}
public double getCompleteRate() {
int sumSize=0;
for(int i=0;i<threadNum;i++){
// 此处显示length cannot be resolved or not a field?
sumSize+=threads[i].length;
}
return sumSize*1.0/fileSize;
}
public class DownThread extends Thread{
private int startPos;
private int currentPartSize;
private RandomAccessFile currentPart;
private int[] threadNum;
public DownThread(int startPos, int currentPartSize,RandomAccessFile currentPart) {
this.startPos=startPos;
this.currentPartSize=currentPartSize;
this.currentPart= currentPart;
}
}
public void run() {
try {
URL url=new URL(path);
HttpURLConnection conn=(HttpURLConnection)url.openConnection();
conn.setConnectTimeout(5*1000);
conn.setRequestMethod("GET");
conn.setRequestProperty("Accept",
"image/gif,image/jpeg,image/pjpeg,image/pjpeg,"
+"applicaton/x-shockwave-flash,application/xaml+xml,"
+"spplication/vnd.ms-xpsdocument,application/x-ms-xbap,"
+"application/x-ms-application,application/vnd.ms-excel,"
+"appplication/vnd.ms-powerpoint,application/mswerd,*/*");
conn.setRequestProperty("Accept-Language", "zh-CN");
conn.setRequestProperty("Charset", "UTF-8");
java.io.InputStream inStream=conn.getInputStream();
inStream.skip(this.startPos);
byte[] buffer=new byte[1024];
int hasRead=0;
int length;
while(length<currentPartSize&&(hasRead=inStream.read(buffer))!=-1);
{
currentPart.write(buffer,0,hasRead);
length+=hasRead;
currentPart.close();
inStream.close();
}
}
catch(Exception e) {
e.printStackTrace();
}
}
public class MultiThreadDown{
public static void main(String[] args)throws Exception{
final DownUtil downUtil=new DownUtil("http://127.0.0.1/"+
"/ProgramData/网页/摄影/0001.jpg",
"ios.jpg",4);
downUtil.download();
new Thread(()->{
while( downUtil.getCompleteRate()<1){
System.out.println("已完成:"+downUtil.getCompleteRate());
try {
Thread.sleep(1000);}
catch(Exception ex) {}
}
}).start();
}
}