JAVA多執行緒下載的實現
抽空研究的java多執行緒下載程式碼:
- package org.swinglife.download;
- import java.io.BufferedInputStream;
- import java.io.BufferedOutputStream;
- import java.io.File;
- import java.io.FileOutputStream;
- import java.io.IOException;
- import java.io.InputStream;
- import java.io.RandomAccessFile;
- import java.net.HttpURLConnection;
- import java.net.URL;
- /***
- * 2013.6.09 Download
- * @author swinglife
- *
- */
- public class DownloadTest {
- private static final int THREADSIZE = 4;
- //下載路徑
- private static final String URL = "http://h.hiphotos.baidu.com/album/w%3D1366%3Bcrop%3D0%2C0%2C1366%2C768/sign=f263a79d91ef76c6d0d2ff28ab20c699/023b5bb5c9ea15ce216d95b5b7003af33b87b28e.jpg";
- //下載檔案
- private static final File TMP = new File("test.jpg");
- public static void main(String[] args) throws Exception {
- URL url = new URL(URL);
- HttpURLConnection con = (HttpURLConnection) url.openConnection();
- //獲得下載檔案大小
- int fileSize = con.getContentLength();
- createTmpFile(fileSize);
- //計算每個執行緒所要下載的位元組
- int dateSize = fileSize/THREADSIZE;
- //計算最後一段資料位元組
- int overSize = fileSize-dateSize*THREADSIZE;
- //剩餘位元組
- int endSize = 0;
- int startSize = 0;
- //建立四個下載執行緒
- for (int i = 0; i < THREADSIZE; i++) {
- endSize = endSize + dateSize;
- startSize = endSize - dateSize;
- DownloadThread t = new DownloadThread(endSize, startSize, TMP,url);
- t.setName(String.valueOf(i)+"號執行緒"); //給執行緒設定名字
- t.start();
- }
- System.out.println("最後一段資料位元組:"+overSize);
- overWriter(overSize, endSize, fileSize, url);
- }
- /***
- * 建立臨時檔案
- * @param fileSize
- * @throws Exception
- */
- private static void createTmpFile(int fileSize) throws Exception{
- byte[] buff = new byte[fileSize];
- //建立臨時檔案
- BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream(TMP));
- out.write(buff, 0, buff.length);
- System.out.println("臨時檔案建立成功");
- }
- /***
- * 寫最後一段位元組資料
- * @param overSize
- * @param endSize
- * @param fileSize
- * @param url
- */
- private static void overWriter(int overSize,int endSize,int fileSize,URL url){
- //如果最後一段位元組還有那麼就寫完最後一點位元組
- if(overSize>0){
- System.out.println("開始寫最後一段資料");
- DownloadThread t = new DownloadThread(fileSize,endSize,TMP,url);
- t.setName("最後資料寫入執行緒");
- t.start();
- }
- }
- }
- /***
- * 下載執行緒類
- * @author swinglife
- *
- */
- class DownloadThread extends Thread{
- private int endSize; //結束位元組
- private int startSize; //開始位元組
- private File file;
- private URL url;
- public DownloadThread(int endSize,int startSize,File file,URL url){
- this.endSize = endSize;
- this.startSize = startSize;
- this.file = file;
- this.url = url;
- }
- @Override
- public void run() {
- BufferedInputStream in = null;
- RandomAccessFile rf = null;
- try {
- System.out.println(super.getName()+"開始下載:"+startSize+"->"+endSize);
- in = new BufferedInputStream(openInputStream());
- rf = new RandomAccessFile(file, "rw");
- byte[] buff = new byte[1024];
- int length = 0;
- rf.seek(startSize); //跳到起始位元組
- while((length=in.read(buff, 0, buff.length))>0){
- rf.write(buff,0,length);
- }
- } catch (IOException e) {
- e.printStackTrace();
- } finally{
- try {
- in.close();
- rf.close();
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- }
- /***
- * 設定請求模式並返回輸入流
- * @return
- * @throws IOException
- */
- private InputStream openInputStream() throws IOException{
- HttpURLConnection con = (HttpURLConnection) url.openConnection();
- con.setRequestMethod("GET");
- //設定請求報頭屬性
- con.setRequestProperty("RANGE", "bytes="+this.startSize+"-"+(this.endSize));
- System.out.println(con.getRequestProperty("RANGE"));
- return con.getInputStream();
- }
- }
相關文章
- Java多執行緒檔案分片下載實現Java執行緒
- Java多執行緒下載分析Java執行緒
- Java多執行緒的實現Java執行緒
- Java多執行緒實現方式Java執行緒
- 【連載 02】多執行緒實現執行緒
- Java實現多執行緒的三種方式Java執行緒
- Java高併發與多執行緒(二)-----執行緒的實現方式Java執行緒
- 多執行緒下載工具 NeatDownloadManager下載執行緒
- 5招教你實現多執行緒場景下的執行緒安全!執行緒
- Java多執行緒【三種實現方法】Java執行緒
- 多執行緒下載檔案執行緒
- ftp多執行緒下載工具FTP執行緒
- Java建立多執行緒的幾種方式實現Java執行緒
- Java之實現多執行緒的方式三:實現Callable介面(結合執行緒池使用)Java執行緒
- Java之實現多執行緒的方式二:實現Runnable介面Java執行緒
- 使用Java實現多執行緒程式設計Java執行緒程式設計
- Java多執行緒並行處理任務的實現Java執行緒並行
- Java多執行緒之守護執行緒實戰Java執行緒
- 如何實現多執行緒執行緒
- Java多執行緒-執行緒中止Java執行緒
- 【Java多執行緒】執行緒安全的集合Java執行緒
- Java多執行緒-執行緒池的使用Java執行緒
- 多執行緒下載原理解析執行緒
- https多執行緒下載程式碼HTTP執行緒
- 多執行緒斷點下載原理執行緒斷點
- Chrome 開啟多執行緒下載Chrome執行緒
- 【Java多執行緒】輕鬆搞定Java多執行緒(二)Java執行緒
- 多執行緒實現多工二執行緒
- 多執行緒實現多工一執行緒
- Android原生下載(下篇)多檔案下載+多執行緒下載Android執行緒
- Java 執行緒池中的執行緒複用是如何實現的?Java執行緒
- java——多執行緒Java執行緒
- java多執行緒Java執行緒
- Java - 多執行緒Java執行緒
- java 多執行緒Java執行緒
- java多執行緒之執行緒的基本使用Java執行緒
- 【Java】【多執行緒】執行緒的生命週期Java執行緒
- Java多執行緒之執行緒中止Java執行緒
- Java多執行緒-執行緒狀態Java執行緒