阅读量:279
try {
URL url = new URL(fileURL); // 创建URL对象
HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection(); // 打开连接
urlConnection.setRequestMethod("GET"); // 设置请求方法
urlConnection.setDoOutput(true); // 允许输出
urlConnection.connect(); // 建立连接
InputStream inputStream = urlConnection.getInputStream(); // 获取输入流
FileOutputStream fileOutput = new FileOutputStream(destinationPath); // 创建文件输出流
byte[] buffer = new byte[1024]; // 创建缓冲区
int bytesRead; // 存放读取字节数
while ((bytesRead = inputStream.read(buffer)) != -1) { // 读取直到没有更多数据
fileOutput.write(buffer, 0, bytesRead); // 写入文件
}
fileOutput.close(); // 关闭文件输出流
inputStream.close(); // 关闭输入流
} catch (IOException e) {
e.printStackTrace(); // 打印异常信息
}
计算文件的校验值
文件下载完成后,可以使用MD5来计算文件的校验值,以下是使用Java的MessageDigest类完成这一步的示例代码:

public String calculateMD5(String filePath) throws IOException {
MessageDigest digest = MessageDigest.getInstance("MD5"); // 创建MD5实例
FileInputStream fis = new FileInputStream(filePath); // 创建文件输入流
byte[] bytesBuffer = new byte[1024]; // 创建缓冲区
int bytesRead; // 存放读取字节数
while ((bytesRead = fis.read(bytesBuffer)) != -1) { // 读取直到没有更多数据
digest.update(bytesBuffer, 0, bytesRead); // 更新摘要
}
fis.close(); // 关闭文件输入流
StringBuilder sb = new StringBuilder(); // 用于存放最终的校验值
for (byte b : digest.digest()) {
sb.append(String.format("x", b)); // 转换为十六进制
}
return sb.toString(); // 返回MD5校验值
}
对比计算出的校验值与预期值
在得到校验值后,与预先定义的校验值做对比,以确保文件的完整性:
String expectedMD5 = "your_expected_md5_value"; // 替换为你的预期MD5值
String downloadedFileMD5 = calculateMD5(destinationPath); // 计算下载文件的MD5
if (downloadedFileMD5.equals(expectedMD5)) {
Log.d("Download", "文件下载成功,校验通过"); // 校验通过
} else {
Log.d("Download", "文件下载失败,校验不通过"); // 校验失败
}
根据校验结果进行后续处理
根据校验结果,可以选择删除文件、重新下载或进行后续操作。
if (downloadedFileMD5.equals(expectedMD5)) {
// 文件校验通过,继续后续操作
} else {
// 文件校验失败,删除文件并提示用户重新下载
new File(destinationPath).delete();
Toast.makeText(context, "文件校验失败,请重新下载", Toast.LENGTH_SHORT).show();
}
相关问题与解答
问题1:如何确保下载的文件未被篡改?
答:可以通过计算文件的校验值(如MD5或SHA-256)并与预期值对比来确保文件未被篡改,如果校验值匹配,则文件完整且未被篡改;否则,可以采取删除文件、重新下载等措施。
问题2:如何处理下载过程中的网络中断?

答:在下载过程中,可以通过捕获异常来处理网络中断,如果发生网络中断,可以选择重试下载或提示用户检查网络连接,还可以考虑使用断点续传技术,以便在网络恢复后从中断的地方继续下载。