編輯:關於Android編程
計算每個線程的下載起始終止位置公式如下
文件讀寫方式4中類型
工程源碼目錄
package cn.itcast.download;
import java.io.File;
import java.io.InputStream;
import java.io.RandomAccessFile;
import java.net.HttpURLConnection;
import java.net.URL;
public class MulThreadDownloader {
public static void main(String[] args) throws Exception {
String path = "http://219.245.72.241:8080/web3/gaosu.jsp";//服務器文件的地址
int threadsize = 3;//開啟三個線程,android應用中開啟的線程數不能太多
new MulThreadDownloader().download(path, threadsize);
}
private void download(String path, int threadsize) throws Exception {
URL downpath = new URL(path);
HttpURLConnection conn = (HttpURLConnection) downpath.openConnection();
conn.setConnectTimeout(5000);
conn.setRequestMethod("GET");
if(conn.getResponseCode() == 200){
int length = conn.getContentLength();//獲取網絡文件的長度
File file = new File(getFileName(path));
RandomAccessFile accessFile = new RandomAccessFile(file, "rwd");//生成本地文件
accessFile.setLength(length);
accessFile.close();
//計算每條線程負責下載的數據量
int block = length % threadsize == 0 ? length / threadsize : length / threadsize +1;
for(int threadid = 0 ; threadid < threadsize ; threadid++){
new DownloadThread(threadid, downpath, block, file).start();
}
}
}
//負責下載操作
private final class DownloadThread extends Thread{
private int threadid;
private URL downpath;
private int block;
private File file;
public DownloadThread(int threadid, URL downpath, int block, File file) {
this.threadid = threadid;
this.downpath = downpath;
this.block = block;
this.file = file;
}
public void run() {
int startposition = threadid * block;//從網絡文件的什麼位置開始下載數據
int endposition = (threadid+1) * block - 1;//下載到網絡文件的什麼位置結束
//指示該線程要從網絡文件的startposition位置開始下載,下載到endposition位置結束
//Range:bytes=startposition-endposition
try{
RandomAccessFile accessFile = new RandomAccessFile(file, "rwd");
accessFile.seek(startposition);//移動指針到文件的某個位置
HttpURLConnection conn = (HttpURLConnection) downpath.openConnection();
conn.setConnectTimeout(5000);
conn.setRequestMethod("GET");
conn.setRequestProperty("Range", "bytes="+ startposition+ "-"+ endposition);//區域下載
//分段下載請求碼不是200,而是206
//if(conn.getResponseCode() == 206){
InputStream inStream = conn.getInputStream();
byte[] buffer = new byte[1024];
int len = 0;
while( (len = inStream.read(buffer)) != -1 ){
accessFile.write(buffer, 0, len);
}
accessFile.close();
inStream.close();
System.out.println("第"+ (threadid+1)+ "線程下載完成");
}catch (Exception e) {
e.printStackTrace();
}
}
}
/**
* 獲取文件名稱
* @param path 下載路徑
* @return
*/
private static String getFileName(String path) {
return path.substring(path.lastIndexOf("/")+ 1);
}
}
客戶端要下載服務器web3目錄裡的gaosu.jsp文件
啟動tomcat,掛起服務器web3
運行上面的java程序,結果展示
此時會發現工程源碼目錄下生成了下載完成的gaZ喎?/kf/ware/vc/" target="_blank" class="keylink">vc3UuanNwzsS8/jxiciAvPg0KPGltZyBhbHQ9"這裡寫圖片描述" src="/uploadfile/Collfiles/20150615/2015061508541077.png" title="" />
數據庫 SQLiteOracle SQLServer mySql SQLite 關系型數據SQLite 數據庫Android系統中集成了輕量級的數據SQLite一, 特點
前言對於內存洩漏,我想大家在開發中肯定都遇到過,只不過內存洩漏對我們來說並不是可見的,因為它是在堆中活動,而要想檢測程序中是否有內存洩漏的產生,通常我們可以借助LeakC
應用實現密碼登陸,記事本內容可增刪改除等操作,用listview顯示每次保存的記事內容,實現了記事本的基本功能。代碼都有詳細注解。1、代碼的目錄密碼登陸使用的是share
當出現崩潰,軟件不會閃退,會出現彈出一個對話框,異常錯誤信息會自動保存在sd卡crash這個文件夾下。後續需要還可以發送到服務器的。看效果圖。1、實現效果圖2、全局異常捕