项目中实现的过程是,要下载的文件大小的最大值是从后台获取,如果手机端下载一部分后暂停,再重新下载,会传递断点续传下载时需要的最大值参数和已下载的文件大小的参数,但是有部分比较大的文件,Gson解析后台的文件大小字段为double类型后是用科学计数表示,比如2.305E8,而不是230500000,所以断点续传下载时请求的返回码是200,而不是206。
InputStream is = null;
OutputStream os = null;
try {
URL url = new URL(downloadUrl);
SSLContext sc = null;
// try {
// sc = SSLContext.getInstance("TLS"); // Https协议
// sc.init(null, new TrustManager[] { new MyTrustManager() }, new SecureRandom());
// } catch (KeyManagementException e) {
// // TODO Auto-generated catch block
// e.printStackTrace();
// } catch (NoSuchAlgorithmException e) {
// // TODO Auto-generated catch block
// e.printStackTrace();
// }
// HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
// HttpsURLConnection.setDefaultHostnameVerifier(new MyHostnameVerifier());
// HttpsURLConnection connection = (HttpsURLConnection) url.openConnection();
HttpURLConnection connection = (HttpURLConnection)
url.openConnection();// Http协议
connection.setConnectTimeout(5000);
connection.setRequestMethod("GET");
BigDecimal bigDecimal = new BigDecimal(maxSize);
String maxSizeStr = bigDecimal.toString();
Log.d("TAG", "断点续传的maxSizeStr==>" + maxSizeStr);
// 设置范围,格式为Range:bytes=x-y;
connection.setRequestProperty("RANGE", "bytes=" + range + "-" + maxSizeStr);
if (connection.getResponseCode() == HttpURLConnection.HTTP_PARTIAL) {// 请求部分数据的返回码是206
// 将要下载的文件写到保存在保存路径下的文件中
is = connection.getInputStream();
os = new FileOutputStream(appSaveFile, true);// 在后面追加
int len = 0;
byte[] bytes = new byte[1024];
while ((len = is.read(bytes)) != -1) {
os.write(bytes, 0, len);
}
}
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
IOUtils.close(is);
IOUtils.close(os);
}
解决这个问题就是按照代码中的实现去处理,使用BigDecimal类作一个转换
BigDecimal bigDecimal = new BigDecimal(maxSize);
由于作者水平有限,语言描述及代码实现中难免有纰漏,望各位看官多提宝贵意见!
Hello , World !
感谢所有!