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());
            }
        });
    }
}
相关推荐
bug-0071 天前
关于前后端自动携带cookie跨域问题
okhttp
weixin_440784112 天前
Java线程池工作原理浅析
android·java·开发语言·okhttp·android studio·android runtime
weixin_440784112 天前
OkHttp使用指南
android·java·okhttp
闻哥3 天前
从 AJAX 到浏览器渲染:前端底层原理与性能指标全解析
java·前端·spring boot·ajax·okhttp·面试
猿小羽5 天前
OkHttp vs Retrofit 技术分析报告 - 1769404939594
http·okhttp·retrofit·csdn
AylKfTscDFw5 天前
EtherCAT总线轴控制,大型非标组装检测设备成熟设备程序,注释非常详细,组合应用日本进口机...
okhttp
龙信科技8 天前
【国内电子数据取证厂商龙信科技】Charles的简单介绍及基本配置
科技·okhttp
Filotimo_9 天前
那在HTML中,action是什么
前端·okhttp·html
灵感菇_10 天前
Android OkHttp框架全解析
android·java·okhttp·网络编程
HIT_Weston11 天前
104、【Ubuntu】【Hugo】搭建私人博客:搜索功能(AJAX请求)
ubuntu·ajax·okhttp