paquet cn.me.test ;
importer java.io.InputStream ;
importer java.io.RandomAccessFile ;
importer java.net.HttpURLConnection ;
importer java.net.URL ;
/**
*Téléchargement multithread
*1 : utilisez RandomAccessFile pour écrire des données à n’importe quel emplacement.
*2 : La quantité de données téléchargées par le premier thread doit être calculée et peut être répartie uniformément. Si ce n'est pas assez moyen,
* Ensuite, le dernier thread traite directement des données relativement petites
*3 : Les fichiers de même taille doivent être préparés avant le téléchargement et obtenus via l'en-tête du fichier.
*/
classe publique MultiThreadDownload {
public static void main (String[] args) lève une exception {
//1 : Déclarez le nom du fichier et l'adresse de téléchargement
Chaîne fileName = "aa.rar" ;
Chaîne urlStr = "http://localhost:7777/day18" ;
//2 : Déclarer l'URL
URL url = nouvelle URL(urlStr+"/"+fileName);
//3 : Obtenir la connexion
HttpURLConnection con=
(HttpURLConnection) url.openConnection();
//4 : Définir la méthode de requête
con.setRequestMethod("GET");
//5 : Récupère l'en-tête de la requête, qui correspond à la longueur du fichier
int length = con.getContentLength();//Obtenir la longueur du fichier téléchargé pour calculer la quantité de données que chaque thread doit télécharger.
//6 : Créer un fichier de même taille dans le répertoire spécifié
RandomAccessFile file = new RandomAccessFile("d:/a/"+fileName, "rw");//Créer un fichier de même taille.
//7 : Définir la taille du fichier, espace réservé
file.setLength(length);//Définir la taille du fichier.
fichier.close();
//8 : Définir le nombre de threads
taille entière = 3 ;
//9 : Calculez le nombre d'octets de données que chaque thread doit télécharger. S'il est exactement divisible, il est préférable d'ajouter 1.
int block = length/size==0?length/size:length/size+1;//Calculez la quantité de données que chaque thread doit télécharger.
System.err.println("Chaque thread doit télécharger : "+block);
//10 : Exécutez trois threads et calculez quel octet commence et se termine
pour(int i=0;i<taille;i++){
int start = i*bloc;
int end = start+(block-1);//Calculez les octets de début et de fin de chaque thread.
System.err.println(i+"="+start+","+end);
new MyDownThread(fileName, start, end,url).start();
}
}
la classe statique MyDownThread étend Thread{
//Définir le nom du fichier
nom de fichier de chaîne privé ;
//Définir par où commencer le téléchargement
début int privé ;
//Définit sur quel octet télécharger
fin int privée ;
URL privée ;
public MyDownThread (String fileName, int début, int fin, URL url) {
this.fileName=fileName;
this.start=début ;
this.end=fin;
this.url=url;
}
@Outrepasser
public void run() {
essayer{
//11 : Commencer le téléchargement
HttpURLConnection con=
(HttpURLConnection) url.openConnection();
con.setRequestMethod("GET");
//12 : Définir l'en-tête de la requête pour les téléchargements segmentés
con.setRequestProperty("Range","bytes="+start+"-"+end);//Définit les blocs de fichiers lus sur le serveur.
//13 : Commencez le téléchargement, vous devez juger 206
if(con.getResponseCode()==206){//L'accès est réussi, le code d'état renvoyé est 206.
InputStream in = con.getInputStream();
//14 : Déclarez un objet de fichier à écriture aléatoire. Notez que rwd fait référence à l'écriture immédiate de données dans le fichier sans utiliser la zone de cache.
RandomAccessFile out = new RandomAccessFile("d:/a/"+fileName,"rwd");
out.seek(start);//Défini pour commencer à écrire des données à partir d'une certaine position dans le fichier.
octet[] b=nouvel octet[1024];
int len = 0;
while((len=in.read(b))!=-1){
out.write(b,0,len);
}
out.close();
joindre();
}
System.err.println(this.getName()+"Exécution terminée");
}attraper(Exception e){
lancer une nouvelle RuntimeException(e);
}
}
}
}