当前位置: 首页 > news >正文

okHttp下载文件到本地存储

这里我们主要是用到response.body().byteStream()

response.body().byteStream() 是网络请求库(如 OkHttp)的常用方法,它在从服务器获取响应时将响应体作为一个 字节流InputStream)返回。这个方法通常用于处理大文件或数据流的下载,例如图片、视频、音频文件或其他二进制数据。

byteStream()byteStream() 方法返回一个 InputStream 对象,它代表响应体中的字节流。通过 InputStream,你可以逐字节地读取数据,非常适合处理大量的二进制数据(例如图片、视频文件、PDF 等)。

使用场景

  1. 下载大文件:对于较大的文件或数据流,使用 byteStream() 方法可以有效避免将整个文件加载到内存中。它允许你逐块读取数据,减少内存消耗。

  2. 流式处理数据:适用于需要对响应数据进行流式处理的场景。例如,当你处理的是音频或视频流时,可以使用 byteStream() 方法获取一个流,实时地解析或显示数据。

  3. 自定义数据处理:在某些情况下,开发者可能希望按需自定义读取方式(如逐字节读取、分块处理等),byteStream() 提供了这种灵活性。

先定义个响应接口


public interface DownloadCallback {void onProgress(int progress);void onSuccess(File file);void onFailure(String errorMessage);
}

public class DownloadFile {private static OkHttpClient client = new OkHttpClient();public static void downloadFile(Activity activity, Context context, String fileUrl, String fileName, DownloadCallback callback) {String externalStorageDir = StringUtils.filePathDir();if (externalStorageDir == null) {callback.onFailure("External_storage_not_available");return;}String fileDir = externalStorageDir + "/Download/file";File fileDirFile = new File(fileDir);if (!fileDirFile.exists()) {boolean created = fileDirFile.mkdirs();if (!created) {callback.onFailure("Failed to create file");return;}}String filePath = fileDir + "/"+fileName;File targetFile = new File(filePath);if (!targetFile.exists()) {try {boolean created = targetFile.createNewFile();if (!created) {callback.onFailure("Failed to create file");return;}} catch (IOException e) {callback.onFailure("Failed to create file: " + e.getMessage());return;}}Request request = new Request.Builder().url(fileUrl).build();client.newCall(request).enqueue(new Callback() {@Overridepublic void onResponse(@NonNull Call call, @NonNull Response response) throws IOException {if (response.isSuccessful() && response.body() != null) {long fileSize = Objects.requireNonNull(response.body()).contentLength();long fileSizeDownloaded = 0;//读入写出try (InputStream inputStream = response.body().byteStream();OutputStream outputStream = new FileOutputStream(targetFile)) {byte[] buffer = new byte[4096];int bytesRead;while ((bytesRead = inputStream.read(buffer)) != -1) {outputStream.write(buffer, 0, bytesRead);fileSizeDownloaded += bytesRead;int progress = (int) ((fileSizeDownloaded * 100) / fileSize);//更新进度    callback.onProgress(progress);}callback.onSuccess(targetFile);} catch (IOException e) {callback.onFailure(e.getMessage());}} else {callback.onFailure("Failed to download file");}}@Overridepublic void onFailure(@NonNull Call call, @NonNull IOException e) {callback.onFailure("Failed to download file: " + e.getMessage());}});}
}


http://www.mrgr.cn/news/23659.html

相关文章:

  • Android V 广播注册和配置注意事项问题
  • ZCC6507高压、高频推挽变压器驱动器替代SN6507
  • 旋转目标检测对照实验-mmrotate基础教程
  • 全球视频云创新挑战赛算法赛道第一名比赛攻略
  • 智慧农业小型气象站
  • Java类和对象(详解)
  • Android - NDK: 在jni层生成java层对象,并调用java层的方法
  • 视频号黄金时间
  • JMeter做接口测试,如何提取登录Cookie
  • Unity Apple Vision Pro 开发(七):UI 交互 + 虚拟键盘
  • 数据结构应用实例(六)——最短路径
  • 2023下半年软考网络规划
  • Vue实现自定义进度条占比功能 Vue自定义进度条功能
  • excel无法保存文件
  • chapter08 面向对象编程高级 知识点总结Note
  • 源代码加密软件有哪些?10款常用的源代码加密软件分享!
  • 批发订货系统源码怎么弄 门店订货系统小程序价格
  • NX二次开发—实体名称工具
  • 数组的常用算法
  • 【Petri网导论学习笔记】Petri网导论入门学习(一)