JAVA 다 중 스 레 드 다운로드 및 정지점 전송

정지점 전송 과 다 중 스 레 드 다운로드 원 리 는 같 습 니 다.
키 코드 키 위치: 정지점 설정
http2.setRequestProperty("RANGE","bytes="+startl+"-");//정지점 위 치 를 설정 하고 서버 에 파일 의 어느 바이트 부터 읽 어 달라 고 요청 합 니 다. osf. seek (startl); /로 컬 파일 을 어느 바이트 부터 쓸 지 설정 합 니 다.
단일 스 레 드 라면 다운로드 파일 이 존재 하 는 지 먼저 판단 해 야 합 니 다.존재 하면 정지점 전송 을 시작 합 니 다. 방법 은 다 중 스 레 드 와 같 습 니 다. 정지점 전송 은 마지막 전송 이 중 단 된 바이트 에서 시작 되 기 때문에 먼저 마지막 으로 중 단 된 위 치 를 가 져 와 야 합 니 다. 파일 길이 (단일 스 레 드 에 대한) f. length () 인 다음 HTTP 요청 헤더 속성 RANGE 를 설정 합 니 다. 이 속성 은 서버 가 어느 것 부터 파일 을 읽 는 지 알려 줍 니 다.로 컬 파일 쓰기 시작 바이트 설정 및 마지막 전송 정지점 에서 계속 쓰기 (정지점 전송)
osf. seek (offset) / / 이 방법 은 offset 다음 바이트 부터 파일 을 쓰기 시작 하도록 설정 합 니 다. 주의: 다 중 스 레 드 는 파일 길 이 를 파일 쓰기 시작 바이트 로 할 수 없습니다. 마지막 으로 읽 고 쓴 위 치 를 설정 해 야 합 니 다. 빠 른 다운 로드 는 이 방법 을 사용 하 는 것 입 니 다.
 
다음은 하나의 예 이다.
import java.io.InputStream;
import java.io.RandomAccessFile;
import java.net.HttpURLConnection;
import java.net.URL;

public class DownloadThread extends Thread {
	String urlt;
	int startl;
	int end;
	String fileName;
	RandomAccessFile osf;

	public DownloadThread(int i, String url, String fileName, int start, int end) {
		this.setName("t" + i); //      
		this.urlt = url; //     
		this.fileName = fileName;
		this.startl = start; //      /      
		this.end = end;//            
	}

	public void run() {
		try {
			osf = new RandomAccessFile(fileName, "rw");
			URL url = new URL(urlt);
			HttpURLConnection http2 = (HttpURLConnection) url.openConnection();
			http2.setRequestProperty("User-Agent", "NetFox");
			http2.setRequestProperty("RANGE", "bytes=" + startl + "-");//       ,                  。
			osf.seek(startl);//                
			InputStream input = http2.getInputStream();
			byte b[] = new byte[1024];//      ,    1024  
			int l;//                ,                     
			int i;
			l = 0;
			System.out.println("  "+this.getName() + ":    ...");
			while ((i = input.read(b, 0, 1024)) != -1 && l < end) { //                    ,       1024  
				osf.write(b, 0, i);
				b = new byte[1024];//     ,         
				l += i;
			}
			System.out.println("  "+this.getName() + ":    ...");
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

}

 
import java.io.File;
import java.io.IOException;
import java.net.HttpURLConnection;
import java.net.URL;

public class DownloadFile {

	/**
	 * @param args
	 */
	static int len;//           
	static int bn;//             
	static int tn; //    
	static String urlt;//     
	static String fileName;

	public static void main(String[] args) {
		// TODO Auto-generated method stub

		try {
			urlt = "http://im.baidu.com/download/BaiduHi_4.2_Beta.exe";
			fileName = "C:\\"+ urlt.split("//")[1].split("/")[urlt.split("//")[1].split("/").length - 1];
			System.out.println("FileName:"+fileName);
			URL url = new URL(urlt);
			HttpURLConnection http = (HttpURLConnection) url.openConnection();
			System.out.println("FileSize:" + http.getContentLength());
			tn = 5;//    5         tn = 5;                
			len = http.getContentLength() / tn;//    (      )             ,           ,         ,
			File f = new File(fileName);
			if (f.exists()) {
				f.delete();
			}
			System.out.println("TEMP    :" + f.length());
			
			Thread t;//      ,
			for (int j = 0; j < tn; j++) {
				if (j == tn - 1) {//                  
					bn = len + (http.getContentLength() % tn);
				} else {
					bn = len;
				}
				System.out.println("t" + j + "      :" + bn + "    :" + len * j);
				t = new DownloadThread(j, urlt, fileName, len * j, bn);
				t.start();
			}

		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

}

좋은 웹페이지 즐겨찾기