Java多線程下載文件實(shí)例詳解
更新時(shí)間:2017年04月05日 11:19:32 作者:歐陽鵬
這篇文章主要為大家詳細(xì)介紹了Java多線程下載文件的實(shí)例代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
本文實(shí)例為大家分享了Java多線程下載文件的具體代碼,供大家參考,具體內(nèi)容如下
import java.io.File; import java.io.InputStream; import java.io.RandomAccessFile; import java.net.HttpURLConnection; import java.net.URL; public class MulThreadDownload { public static void main(String[] args) throws Exception { String path = "http://192.168.1.100:8080/Hello/Big.exe"; new MulThreadDownload().download(path, 3); } /** * 下載文件 * * @param path * 網(wǎng)絡(luò)文件路徑 * @param threadSize * 線程數(shù) * @throws Exception */ private void download(String path, int threadSize) throws Exception { URL url = new URL(path); HttpURLConnection connection = (HttpURLConnection) url.openConnection(); connection.setRequestMethod("GET"); connection.setConnectTimeout(5000); if (connection.getResponseCode() == 200) { int length = connection.getContentLength();// 獲取網(wǎng)絡(luò)文件長度 File file = new File(getFileName(path)); // 在本地生成一個(gè)長度與網(wǎng)絡(luò)文件相同的文件 RandomAccessFile accessFile = new RandomAccessFile(file, "rwd"); accessFile.setLength(length); accessFile.close(); // 計(jì)算每條線程負(fù)責(zé)下載的數(shù)據(jù)量 int block = length % threadSize == 0 ? length / threadSize : length / threadSize + 1; for (int threadId = 0; threadId < threadSize; threadId++) { new DownloadThread(threadId, block, url, file).start(); } } else { System.out.println("download fail"); } } private class DownloadThread extends Thread { private int threadId; private int block; private URL url; private File file; public DownloadThread(int threadId, int block, URL url, File file) { this.threadId = threadId; this.block = block; this.url = url; this.file = file; } @Override public void run() { int start = threadId * block; // 計(jì)算該線程從網(wǎng)絡(luò)文件什么位置開始下載 int end = (threadId + 1) * block - 1; // 計(jì)算下載到網(wǎng)絡(luò)文件什么位置結(jié)束 try { RandomAccessFile accessFile = new RandomAccessFile(file, "rwd"); accessFile.seek(start); //從start開始 HttpURLConnection connection = (HttpURLConnection) url .openConnection(); connection.setRequestMethod("GET"); connection.setConnectTimeout(5000); //設(shè)置獲取資源數(shù)據(jù)的范圍,從start到end connection.setRequestProperty("Range", "bytes=" + start + "-" + end); //注意多線程下載狀態(tài)碼是 206 不是200 if (connection.getResponseCode() == 206) { InputStream inputStream = connection.getInputStream(); byte[] buffer = new byte[1024]; int len = 0; while ((len = inputStream.read(buffer)) != -1) { accessFile.write(buffer, 0, len); } accessFile.close(); inputStream.close(); } System.out.println("第" + (threadId + 1) + "條線程已經(jīng)下載完成"); } catch (Exception e) { e.printStackTrace(); } } } /** * 獲取文件名稱 * * @param path * 網(wǎng)絡(luò)文件路徑 * @return */ private String getFileName(String path) { return path.substring(path.lastIndexOf("/") + 1); } }
以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
詳解SpringCloud服務(wù)認(rèn)證(JWT)
本篇文章主要介紹了SpringCloud服務(wù)認(rèn)證(JWT),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-01-01Java信號(hào)量Semaphore原理及代碼實(shí)例
這篇文章主要介紹了Java信號(hào)量Semaphore原理及代碼實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-10-10SWT(JFace) FTP客戶端實(shí)現(xiàn)
SWT(JFace)小制作:FTP客戶端實(shí)現(xiàn)2009-06-06SpringBoot通過RedisTemplate執(zhí)行Lua腳本的方法步驟
這篇文章主要介紹了SpringBoot通過RedisTemplate執(zhí)行Lua腳本的方法步驟,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-02-02Java mysql數(shù)據(jù)庫并進(jìn)行內(nèi)容查詢實(shí)例代碼
這篇文章主要介紹了Java mysql數(shù)據(jù)庫并進(jìn)行內(nèi)容查詢實(shí)例代碼的相關(guān)資料,需要的朋友可以參考下2016-11-11