자바 파일 의 정지점 전송 다운 로드 를 실현 합 니 다.
우선 스 레 드 ID 라 는 이름 의 다운로드 진행 파일 을 설정 합 니 다.
매번 다운로드 진 도 는 이 파일 에 저장 되 며, 다음 다운로드 시 진도 파일 의 내용 에 따라 다운로드 진 도 를 판단 합 니 다.
package com.ldw.multilthreaddownload;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.RandomAccessFile;
import java.net.HttpURLConnection;
import java.net.URL;
public class Multidownload {
static int ThreadCount = 3; //
static int finishedThread = 0; //
static String path = "http://192.168.0.102:8080/QQ.exe"; //
public static void main(String[] args) {
// TODO Auto-generated method stub
// get ,
try {
URL url = new URL(path);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("GET");
conn.setConnectTimeout(5000);
conn.setReadTimeout(5000);
if(conn.getResponseCode() == 200){
//
int length = conn.getContentLength();
File file = new File("QQ.exe");
//
RandomAccessFile raf = new RandomAccessFile(file, "rwd");
//
raf.setLength(length);
// raf
raf.close();
//
int size = length / Multidownload.ThreadCount;
for(int i = 0; i < Multidownload.ThreadCount; i ++){
//startIndex,endIndex
int startIndex = i * size;
int endIndex = (i + 1) * size - 1;
if(i == ThreadCount - 1){
// ,
endIndex = length -1;
}
//System.out.println(" " + i + " " + startIndex + " " + endIndex);
new DownLoadThread(startIndex, endIndex, i).start();
}
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
class DownLoadThread extends Thread{
int startIndex;
int endIndex;
int threadId;
public DownLoadThread(int startIndex, int endIndex, int threadId) {
super();
this.startIndex = startIndex;
this.endIndex = endIndex;
this.threadId = threadId;
}
@Override
public void run(){
// http
URL url;
try {
File fileProgress = new File(threadId + ".txt");
// ,
if(fileProgress.exists()){
FileInputStream fis = new FileInputStream(fileProgress);
BufferedReader br = new BufferedReader(new InputStreamReader(fis));
// , ,
startIndex += Integer.parseInt(br.readLine());
fis.close();
}
System.out.println(" " + threadId + " " + startIndex +"====" + endIndex);
url = new URL(Multidownload.path);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("GET");
conn.setConnectTimeout(5000);
conn.setReadTimeout(5000);
//
conn.setRequestProperty("Range", "bytes=" + startIndex + "-" + endIndex);
// 206
if(conn.getResponseCode() == 206){
//
InputStream is = conn.getInputStream();
byte[] b = new byte[1024];
int len = 0;
int total = 0;
//
File file = new File("QQ.exe");
RandomAccessFile raf = new RandomAccessFile(file, "rwd");
// ,startIndex
raf.seek(startIndex);
while((len = is.read(b)) != -1 ){
// ,
raf.write(b, 0, len);
total += len;
//System.out.println(" " + threadId + " " + total);
//
//File fileProgress = new File(threadId + ".txt");
RandomAccessFile fileProgressraf = new RandomAccessFile(fileProgress, "rwd");
// ,
fileProgressraf.write((total + "").getBytes());
fileProgressraf.close();
}
System.out.println(" " + threadId + " ===========================");
raf.close();
// ,
Multidownload.finishedThread++;
//
synchronized(Multidownload.path){
if(Multidownload.finishedThread == Multidownload.ThreadCount){
for(int i = 0; i < Multidownload.ThreadCount; i++){
File filefinish = new File(i + ".txt");
filefinish.delete();
}
Multidownload.finishedThread = 0;
}
}
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.