okHttp下载文件到本地存储

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

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

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

使用场景

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

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

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

先定义个响应接口

java 复制代码
public interface DownloadCallback {
    void onProgress(int progress);

    void onSuccess(File file);

    void onFailure(String errorMessage);
}
java 复制代码
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() {
            @Override
            public 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");
                }
            }

            @Override
            public void onFailure(@NonNull Call call, @NonNull IOException e) {
                callback.onFailure("Failed to download file: " + e.getMessage());
            }
        });
    }
}
相关推荐
泡海椒5 小时前
JQuick-Curl 性能分析:并发场景下的性能表现与调优,第三方接口调用不只要快写也要稳跑
java·开发语言·okhttp
泡海椒7 小时前
JQuick-Curl 二次开发:自定义解析器、扩展点开发指南,如何把框架能力真正变成团队资产
java·开发语言·okhttp·maven
摇滚侠1 天前
《SpringBoot 3:入门与应用实战》第 9 章 跨域问题 阅读笔记 27
spring boot·笔记·okhttp
刘广睿3 天前
断点续传与分片下载是怎么实现的?Range 请求在视频下载中的工程实践
okhttp·ffmpeg·音视频·下载·python3.11
泡海椒9 天前
JQuick-Curl vs RestTemplate / OkHttp / OpenFeign:框架选型对比,谁更适合第三方接口调用?
okhttp
Co_Hui12 天前
OkHttp 原理
okhttp
殷忆枫12 天前
BOA服务器下实现视频回放功能(CGI+软链接方案)
服务器·okhttp·音视频
消失的旧时光-194314 天前
第十篇:Ktor Custom Client Plugin:从 OkHttp Interceptor 真正理解请求与响应生命周期
okhttp·plugin·ktor·kmp
mmsx15 天前
基于 Android 的校园信息管理系统源码
android·java·okhttp
Full Stack Developme22 天前
跨站请求伪造 (CSRF) 是什么 设计及工作原理
前端·okhttp·csrf