Android学習レコード(4)-javaでマルチスレッドダウンロードの基本原理と基本的な使い方を学ぶ①
マルチスレッドダウンロードは私たちの生活の中で非常によく見られます.例えば、迅雷は私たちがよく使うマルチスレッドのダウンロードツールです.もちろん、ブレークポイントの継続もあります.ブレークポイントの継続は次の節で言えば、android携帯電話側がファイルをダウンロードするときもマルチスレッドでダウンロードすることができます.ここではjavaでテストを書きます.実はandroidの実現はjavaと同じです.Javaをマスターしてandroidの中でどのように実現したかを知っていて、くだらないことはあまり言わないで、どのようにマルチスレッドとマルチスレッドを実現する原理はどんなものか、今私たちは勉強してみましょう.マルチスレッドダウンロードの原理と手順: 1.ローカルにサーバファイルと同じサイズのテンポラリファイルを作成します. 2、計算はいくつかのスレッドを割り当ててサーバー上の資源をダウンロードして、各スレッドがファイルをダウンロードする場所を知っています. ステップ2の具体的な方法と操作: ファイルの長さ/3(スレッドの数)=各スレッドのダウンロードファイルのサイズ ファイル長を10とすると、 スレッド1:0-2 スレッド2:3-5 スレッド3:6-ファイル末尾 スレッドごとにダウンロードされる場所の計算方法: 開始位置: (スレッドid-1)*各ブロックのサイズ 終了位置: (スレッドid*各ブロックサイズ)-1 3、複数(3)個のスレッドを開き、各スレッドは対応する場所のファイルをダウンロードする 4、すべてのスレッドが自分のデータをダウンロードしたら、サーバー上のリソースがローカルにダウンロードされます.
ここでは、マルチスレッドダウンロードに関するjavaの関連クラスRandomAccessFileについて説明します.
RandomAccessFileランダムファイルアクセスクラスにはRandomAccessFileのみseek検索メソッドがあり、このメソッドはファイルにのみ適用されます.seek()メソッドで位置を指定し、ファイルを位置決めします.つまり、ランダムにファイルを書くときにどの位置から開くかを指定できます.
書き始める.このクラスを利用してこそ、ファイルのマルチスレッドダウンロードが実現されます.
基本原理と関連する説明は以上の通りです.これについては、コードを見てみましょう.
本文はブロガーのオリジナル文章で、ブロガーの許可を得ずに転載してはならない.
ここでは、マルチスレッドダウンロードに関するjavaの関連クラスRandomAccessFileについて説明します.
RandomAccessFileランダムファイルアクセスクラスにはRandomAccessFileのみseek検索メソッドがあり、このメソッドはファイルにのみ適用されます.seek()メソッドで位置を指定し、ファイルを位置決めします.つまり、ランダムにファイルを書くときにどの位置から開くかを指定できます.
書き始める.このクラスを利用してこそ、ファイルのマルチスレッドダウンロードが実現されます.
基本原理と関連する説明は以上の通りです.これについては、コードを見てみましょう.
package net.loonggg.test;
import java.io.InputStream;
import java.io.RandomAccessFile;
import java.net.HttpURLConnection;
import java.net.URL;
/***
*
*
* @author loonggg
*
*/
public class MutilDownloader {
//
public static final int THREAD_COUNT = 3;
public static void main(String[] args) throws Exception {
String path = "http://down.360safe.com/yunpan/360wangpan_setup.exe";
// , , ,
URL url = new URL(path);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
//
conn.setConnectTimeout(5000);
//
conn.setRequestMethod("GET");
int code = conn.getResponseCode();
if (code == 200) {
// ,
int length = conn.getContentLength();
System.out.println("---- ----" + length);
//
RandomAccessFile raf = new RandomAccessFile("yunpan.exe", "rwd");
//
raf.setLength(length);
// raf
raf.close();
// 3
//
int blockSize = length / THREAD_COUNT;
for (int threadId = 1; threadId <= THREAD_COUNT; threadId++) {
//
int startIndex = (threadId - 1) * blockSize;
int endIndex = threadId * blockSize - 1;
if (threadId == THREAD_COUNT) {
endIndex = length;
}
System.out.println("----threadId---" + threadId
+ "--startIndex--" + startIndex + "--endIndex--"
+ endIndex);
//
new DownloadThread(path, threadId, startIndex, endIndex)
.start();
}
}
}
/**
* ,
*
* @author loonggg
*
*/
public static class DownloadThread extends Thread {
private int threadId;
private int startIndex;
private int endIndex;
private String path;
/**
* @param path
*
* @param threadId
* id
* @param startIndex
*
* @param endIndex
*
*/
public DownloadThread(String path, int threadId, int startIndex,
int endIndex) {
this.path = path;
this.threadId = threadId;
this.startIndex = startIndex;
this.endIndex = endIndex;
}
@Override
public void run() {
try {
URL url = new URL(path);
HttpURLConnection conn = (HttpURLConnection) url
.openConnection();
conn.setRequestMethod("GET");
// :
conn.setRequestProperty("Range", "bytes=" + startIndex + "-"
+ endIndex);
conn.setConnectTimeout(5000);
// 200 ok 206 ok
int code = conn.getResponseCode();
System.out.println("---code---" + code);
InputStream is = conn.getInputStream();// ,
RandomAccessFile raf = new RandomAccessFile("yunpan.exe", "rwd");
//
raf.seek(startIndex);//
int len = 0;
byte[] buffer = new byte[1024];
while ((len = is.read(buffer)) != -1) {
raf.write(buffer, 0, len);
}
is.close();
raf.close();
System.out.println(" " + threadId + ": !");
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
本文はブロガーのオリジナル文章で、ブロガーの許可を得ずに転載してはならない.