Java多線程下載文件實例詳解
更新時間:2017年04月05日 11:19:32 作者:歐陽鵬
這篇文章主要為大家詳細(xì)介紹了Java多線程下載文件的實例代碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下
本文實例為大家分享了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));
// 在本地生成一個長度與網(wǎng)絡(luò)文件相同的文件
RandomAccessFile accessFile = new RandomAccessFile(file, "rwd");
accessFile.setLength(length);
accessFile.close();
// 計算每條線程負(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; // 計算該線程從網(wǎng)絡(luò)文件什么位置開始下載
int end = (threadId + 1) * block - 1; // 計算下載到網(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)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
詳解SpringCloud服務(wù)認(rèn)證(JWT)
本篇文章主要介紹了SpringCloud服務(wù)認(rèn)證(JWT),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-01-01
SpringBoot通過RedisTemplate執(zhí)行Lua腳本的方法步驟
這篇文章主要介紹了SpringBoot通過RedisTemplate執(zhí)行Lua腳本的方法步驟,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價值,需要的朋友可以參考下2020-02-02
Java mysql數(shù)據(jù)庫并進(jìn)行內(nèi)容查詢實例代碼
這篇文章主要介紹了Java mysql數(shù)據(jù)庫并進(jìn)行內(nèi)容查詢實例代碼的相關(guān)資料,需要的朋友可以參考下2016-11-11

