JAVA記憶體對映檔案實現多執行緒下載
JAVA NIO記憶體對映檔案可以實現多執行緒下載
首先,使用firefox下載一個tomcat
JAVA多執行緒下載程式
比對下載的檔案
首先,使用firefox下載一個tomcat
JAVA多執行緒下載程式
-
import java.io.FileNotFoundException;
-
import java.io.IOException;
-
import java.io.InputStream;
-
import java.io.RandomAccessFile;
-
import java.net.HttpURLConnection;
-
import java.net.URL;
-
import java.nio.MappedByteBuffer;
-
import java.nio.channels.FileChannel.MapMode;
-
-
class Worker implements Runnable {
-
//多執行緒下載的數量
-
private static int THREADS = 4;
-
//每個執行緒下載開始的位置
-
private int startIndex;
-
//每個執行緒下載內容的長度
-
private int length;
-
//檔案儲存位置
-
private String localFile;
-
//遠端檔案的流
-
InputStream in;
-
-
private Worker(String urlFile, String localFile, int startIndex, int length) throws IOException {
-
this.startIndex = startIndex;
-
this.length = length;
-
this.localFile = localFile;
-
init(urlFile);
-
}
-
-
/**
-
* 主執行緒開啟網路檔案,先分割為指定的大小,然後開啟多執行緒下載
-
*/
-
public Worker(String urlFile, String localFile) throws IOException {
-
this.localFile = localFile;
-
int contentLength = init(urlFile);
-
int step = contentLength / THREADS;
-
int index = 0;
-
for (int i = 0; i < THREADS; i++) {
-
if (i == 0) {
-
this.startIndex = 0;
-
this.length = step;
-
new Thread(this).start();
-
} else if (i == THREADS - 1) {
-
Worker worker = new Worker(urlFile, localFile, index, contentLength - index);
-
new Thread(worker).start();
-
} else {
-
Worker worker = new Worker(urlFile, localFile, index, step);
-
new Thread(worker).start();
-
}
-
index = index + step;
-
}
-
}
-
-
private int init(String urlFile) throws IOException {
-
URL url;
-
-
url = new URL(urlFile);
-
-
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
-
-
connection.setConnectTimeout(5 * 1000);
-
connection.setRequestMethod("GET");
-
connection.setRequestProperty("Accept", "image/gif, image/jpeg, image/pjpeg, image/pjpeg, " + "application/x-shockwave-flash, application/xaml+xml, "
-
+ "application/vnd.ms-xpsdocument, application/x-ms-xbap, " + "application/x-ms-application, application/vnd.ms-excel, " + "application/vnd.ms-powerpoint, application/msword, */*");
-
connection.setRequestProperty("Accept-Language", "zh-CN");
-
connection.setRequestProperty("Charset", "UTF-8");
-
connection.setRequestProperty("Connection", "Keep-Alive");
-
InputStream in = connection.getInputStream();
-
this.in = in;
-
return connection.getContentLength();
-
}
-
-
@Override
-
public void run() {
-
System.out.println(this);
-
try {
-
RandomAccessFile localRandomFile = new RandomAccessFile(localFile, "rw");
-
MappedByteBuffer buffer = localRandomFile.getChannel().map(MapMode.READ_WRITE, startIndex, length);
-
int i = 0;
-
in.skip(startIndex);
-
while (i < length) {
-
buffer.put((byte) in.read());
-
i++;
-
}
-
buffer.force();
-
in.close();
-
localRandomFile.close();
-
} catch (FileNotFoundException e) {
-
e.printStackTrace();
-
} catch (IOException e) {
-
e.printStackTrace();
-
}
-
}
-
-
@Override
-
public String toString() {
-
return "Worker [localFile=" + localFile + ", startIndex=" + startIndex + ", length=" + length + "]";
-
}
-
-
public static void main(String[] args) throws IOException {
-
new Worker("http://mirrors.cnnic.cn/apache/tomcat/tomcat-7/v7.0.53/bin/apache-tomcat-7.0.53.zip", "tomcat.zip");
-
}
-
- }
比對下載的檔案
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29254281/viewspace-1162157/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Java多執行緒檔案分片下載實現Java執行緒
- 多執行緒下載檔案執行緒
- Java多執行緒記憶體模型Java執行緒記憶體模型
- Java多執行緒之記憶體模型Java執行緒記憶體模型
- 使用記憶體對映檔案(mmap)記憶體
- Android原生下載(下篇)多檔案下載+多執行緒下載Android執行緒
- 共享記憶體對映(linux程式與執行緒學習筆記)記憶體Linux執行緒筆記
- 多執行緒之Java記憶體模型(JMM)(一)執行緒Java記憶體模型
- Java 執行緒記憶體模型Java執行緒記憶體模型
- Java多執行緒下載分析Java執行緒
- 二進位制檔案記憶體對映記憶體
- Python mmap的使用-檔案記憶體對映Python記憶體
- 多執行緒下載nginx站點目錄下檔案執行緒Nginx
- 記一次對Java多執行緒記憶體可見性的測試Java執行緒記憶體
- Java記憶體對映,上G大檔案輕鬆處理Java記憶體
- 1、多執行緒同步——CPU、core核、執行緒、記憶體執行緒記憶體
- windows核心程式設計--記憶體對映檔案Windows程式設計記憶體
- 居然這就是C++記憶體對映檔案?!C++記憶體
- Java多執行緒的實現Java執行緒
- Java多執行緒實現方式Java執行緒
- 多執行緒具體實現執行緒
- 【連載 02】多執行緒實現執行緒
- delphi多執行緒檔案複製怎麼實現執行緒
- 深入理解Java的堆記憶體和執行緒記憶體Java記憶體執行緒
- Java多執行緒之—Synchronized方式和CAS方式實現執行緒安全效能對比Java執行緒synchronized
- Java實現多檔案邊壓縮邊下載Java
- 多執行緒下載工具 NeatDownloadManager下載執行緒
- Java多執行緒筆記Java執行緒筆記
- Java多執行緒【三種實現方法】Java執行緒
- Java多執行緒-帶你認識Java記憶體模型,記憶體分割槽,從原理剖析Volatile關鍵字Java執行緒記憶體模型
- ftp多執行緒下載工具FTP執行緒
- Java實現檔案下載功能Java
- 溫故之.NET程式間通訊——記憶體對映檔案記憶體
- Java高併發與多執行緒(二)-----執行緒的實現方式Java執行緒
- 5招教你實現多執行緒場景下的執行緒安全!執行緒
- Java實現多執行緒的三種方式Java執行緒
- 使用Java實現多執行緒程式設計Java執行緒程式設計
- 【多執行緒與高併發原理篇:3_java記憶體模型】執行緒Java記憶體模型
- Java多執行緒之守護執行緒實戰Java執行緒