paket cn.me.test;
impor java.io.InputStream;
impor java.io.RandomAccessFile;
impor java.net.HttpURLConnection;
impor java.net.URL;
/**
* Unduhan multi-utas
*1: Gunakan RandomAccessFile untuk menulis data di lokasi mana pun.
*2: Jumlah data yang diunduh pada thread pertama perlu dihitung dan dapat didistribusikan secara merata. Jika tidak cukup rata-rata,
* Kemudian thread terakhir langsung memproses data yang relatif kecil
*3: File dengan ukuran yang sama harus disiapkan sebelum diunduh dan diperoleh melalui header file
*/
Unduhan MultiThread kelas publik {
public static void main(String[] args) melempar Pengecualian {
//1: Deklarasikan nama file dan alamat download
Stringnamafile = "aa.rar";
String urlStr = "http://localhost:7777/day18";
//2: Deklarasikan Url
URL url = URL baru(urlStr+"/"+namafile);
//3: Dapatkan koneksinya
HttpURLConnection con=
(HttpURLConnection) url.openConnection();
//4: Tetapkan metode permintaan
con.setRequestMethod("DAPATKAN");
//5: Dapatkan header permintaan, yang merupakan panjang file
int length = con.getContentLength();//Dapatkan panjang file yang diunduh untuk menghitung jumlah data yang harus diunduh setiap thread.
//6: Buat file dengan ukuran yang sama di direktori yang ditentukan
RandomAccessFile file = new RandomAccessFile("d:/a/"+fileName, "rw");//Buat file dengan ukuran yang sama.
//7: Mengatur ukuran file, placeholder
file.setLength(length);//Mengatur ukuran file.
file.close();
//8: Tentukan jumlah thread
int ukuran = 3;
//9: Hitung berapa banyak byte data yang harus diunduh setiap thread. Jika data tersebut benar-benar habis dibagi, yang terbaik adalah, jika tidak, tambahkan 1
int block = length/size==0?length/size:length/size+1;//Hitung jumlah data yang harus diunduh setiap thread.
System.err.println("Setiap thread harus diunduh: "+blok);
//10: Jalankan tiga thread dan hitung byte mana yang dimulai dan diakhiri
untuk(int i=0;i<ukuran;i++){
int mulai = i*blok;
int end = start+(block-1);//Hitung byte awal dan akhir setiap thread.
Sistem.err.println(i+"="+mulai+","+akhir);
new MyDownThread(namafile, awal, akhir,url).start();
}
}
kelas statis MyDownThread memperluas Thread{
//Tentukan nama file
Nama file String pribadi;
//Tentukan di mana untuk mulai mengunduh
awal int pribadi;
//Tentukan byte mana yang akan diunduh
ujung int pribadi;
url URL pribadi;
public MyDownThread(String nama file,int awal,int akhir,url URL){
this.namafile=namafile;
this.start=mulai;
ini.akhir=akhir;
ini.url=url;
}
@Mengesampingkan
menjalankan kekosongan publik() {
mencoba{
//11: Mulai mengunduh
HttpURLConnection con=
(HttpURLConnection) url.openConnection();
con.setRequestMethod("DAPATKAN");
//12: Mengatur header permintaan untuk download tersegmentasi
con.setRequestProperty("Range","bytes="+start+"-"+end);//Mengatur blok file yang dibaca dari server.
//13: Mulai mengunduh, perlu menilai 206
if(con.getResponseCode()==206){//Akses berhasil, kode status yang dikembalikan adalah 206.
InputStream di = con.getInputStream();
//14: Mendeklarasikan objek file tulis acak. Perhatikan bahwa rwd mengacu pada penulisan data ke file segera tanpa menggunakan area cache.
RandomAccessFile keluar = new RandomAccessFile("d:/a/"+namafile,"rwd");
out.seek(start);//Mengatur untuk mulai menulis data dari posisi tertentu dalam file.
byte[] b=byte baru[1024];
int len = 0;
while((len=dalam.baca(b))!=-1){
keluar.tulis(b,0,len);
}
keluar.dekat();
melampirkan();
}
System.err.println(this.getName()+"Eksekusi selesai");
}menangkap(Pengecualian e){
lempar RuntimeException baru(e);
}
}
}
}