Android 斷點續傳下載
斷點續傳下載,其實就是記錄下原來下載的位置,然後從那個位置開始下載就是了。
代碼如下。
/** * 作用:斷點續傳下載<BR> * 作者:peijiangping<BR> * 日期:2011-6-11 */ public static int doDownloadTheFile_test(String strPath, String filePath, String filename, int mode, long size, Handler handler) { //file.size()即可得到原來下載文件的大小 //下載路徑 String url = strPath; // 設置代理 Header header = null; if (mode == 2) { //移動內網的時候使用代理 url = format_CMWAP_URL(strPath); header = new BasicHeader("X-Online-Host", format_CMWAP_ServerName(strPath)); } HttpResponse response = null; // 用來獲取下載文件的大小 HttpResponse response_test = null; try { HttpClient client = new DefaultHttpClient(); HttpClient client_test = new DefaultHttpClient(); HttpGet request = new HttpGet(url); HttpGet request_test = new HttpGet(url); if (header != null) { request.addHeader(header); } response_test = client_test.execute(request_test); //獲取需要下載文件的大小 long fileSize = response_test.getEntity().getContentLength(); // 驗證下載文件的完整性 if (fileSize != 0 && fileSize == size) { return 1; } //設置下載的數據位置XX字節到XX字節 Header header_size = new BasicHeader("Range", "bytes=" + size + "-" + fileSize); request.addHeader(header_size); response = client.execute(request); InputStream is = response.getEntity().getContent(); if (is == null) { throw new RuntimeException("stream is null"); } SDCardUtil.createFolder(filePath); //獲取文件對象,開始往文件裏麵寫內容 File myTempFile = new File(filePath + "/" + filename); RandomAccessFile fos = new RandomAccessFile(myTempFile, "rw"); //從文件的size以後的位置開始寫入,其實也不用,直接往後寫就可以。有時候多線程下載需要用 fos.seek(size); byte buf[] = new byte[1024]; long downloadfilesize = 0; do { int numread = is.read(buf); if (numread <= 0) { break; } fos.write(buf, 0, numread); if (handler != null) { Message msg = new Message(); downloadfilesize += numread; double percent = (double) (downloadfilesize + size) / fileSize; msg.obj = String.valueOf(percent); handler.sendMessage(msg);// 更新下載進度百分比 } } while (true); is.close(); } catch (Exception ex) { ex.printStackTrace(); return -1; } return 1; }
最後更新:2017-04-03 18:52:12