編輯:關於Android編程
獲取到服務器端資源文件的大小(connection.getContentLength())
String path = "http://localhost:8080/ff.exe";
URL url = new URL(path);
// 獲取鏈接
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
// 參數
connection.setRequestMethod("GET");
connection.setConnectTimeout(5000);
// 響應碼
int responseCode = connection.getResponseCode();
if (responseCode == 200) {
// 得到服務端返回的文件大小
long contentLength = connection.getContentLength();
System.out.println("服務器文件大小:"+contentLength);
}
// 斷開連接
connection.disconnect();
在本地創建一個大小和服務器一樣的的空白文件
File file = new File("temp.ext");
RandomAccessFile raf= new RandomAccessFile(file, "rw");
raf.setLength(contentLength);
根據開啟線程的數量,把服務器資源給等分成若干份(threadCount:線程數量)
假設文件大小是10個byte。(長度:length)
假設3個線程(線程數量:threadCount)。
int blockSize = length / threadCount;
線程1 下載3個byte 1-3 0 * blockSize + 1 ~ 1 * blockSize
線程2 下載3個byte 4-6 1 * blockSize + 1 ~ 2 * blockSize
線程3 下載4個byte 7-10 2 * blockSize + 1 ~ 3 * blockSize(length)
// 開啟若干個子線程,分別去下載對應的資源
long threadCount = 3;
long blockSize = contentLength / threadCount;
for (int i = 1; i <= threadCount; i++) {
// 計算下載起始、結束位置
long startIndex = (i - 1) * blockSize + 0;// 服務器也是從0開始
long endIndex = i * blockSize - 1; //
// 最後一個線程
if (i == threadCount) {
endIndex = contentLength - 1;
}
System.out.println("開啟線程:" + i + ",下載的位置:(" + startIndex + "~"
+ endIndex + ")");
new DownloadThread(i, startIndex, endIndex, path).start();
}
創建線程類
static class DownloadThread extends Thread {
private int threadId;
private long startIndex;
private long endIndex;
private String path;
public DownloadThread(int threadId, long startIndex, long endIndex,
String path) {
super();
this.threadId = threadId;
this.startIndex = startIndex;
this.endIndex = endIndex;
this.path = path;
}
public void run() {
URL url;
try {
url = new URL(path);
// 獲取鏈接
HttpURLConnection connection = (HttpURLConnection) url
.openConnection();
// 參數
connection.setRequestMethod("GET");
connection.setConnectTimeout(5000);
// 告訴服務器下載的參數
connection.setRequestProperty("Range", "bytes=" + startIndex
+ "-" + endIndex);
// 響應碼
int responseCode = connection.getResponseCode();
System.out.println("服務器狀態碼:" + responseCode);
// 下載服務器文件,返回的是206
if (responseCode == 206) {
InputStream inputStream = connection.getInputStream();
File file = new File("temp.exe");
RandomAccessFile raf = new RandomAccessFile(file, "rw");
// 指定文件開始寫的位置
raf.seek(startIndex);
System.out.println("第" + threadId + "個線程,寫文件的開始、結束位置("
+ (startIndex) + "," + (endIndex) + ")");
int len = 0;
byte[] buf = new byte[1024];
while ((len = inputStream.read(buf)) != -1) {
raf.write(buf, 0, len);
}
inputStream.close();
raf.close();
System.out.println("第" + threadId + "個線程下載完畢了");
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
在Part 4我們回顧了一下Fragment的基本概念,在本節中我們就來學習Fragment應用的簡單例子吧! 就是使用Fragment來實現
大家好,趁著現在別人都去吃飯的時間,來給大家講一講React Native中Android部分的控件ViewPagerAndroid的講解,這裡特別提醒一下,我寫的博客都
有時候,我們的實體類中會有一些屬性,但是數據庫中沒有對應的類型,這個時候我們就需要自定義轉換器進行類型轉換。很常見的處理就是Date類型一般如果精度要求不高的話我們會轉換
一、訪問網絡資源1、使用統一資源定位符獲取網絡資源的路徑urlURL url = new URL(path);2、通過url打開網絡連接(連接方式有http連接,ftp連