OkHttp3断点下载

一、流程
1,与服务器建立请求,获取到该文件的大小,然后断开连接;
2,创建一个.tem文件来存储该下载的文件;
3,创建一个RadomAccessFile文件,并获取到已下载的文件的大小;
4,建立请求,传入需要下载的文件的区间,申请连接;
5,请求成功(如果服务器支持断点下载,则Response返回的code==206);
6,通过RandomAccessFile移动指针到已下载的位置,然后开始写入数据到本地;
二、RandomAccessFile
1,总体概念:RandomAccessFile类的主要功能是完成随机读取功能,可以读取指定位置的内容。之前的File类只是针对文件本身进行操作的,而如果要想对文件内容进行操作,则可以使用RandomAccessFile类,此类属于随机读取类,可以随机读取一个文件中指定位置的数据;
2,常用方法:
1)public  RandomAccessFile(File file, String mode)throws FileNotFoundException  构造方法  接收File类的对象,指定操作路径,但是在设置时需要设置模式:"r": 只读、"w": 只写、"rw": 读写。
(2)、public RandomAccessFile(String name, String mode) throws FileNotFoundException 构造方法 不再使用File类对象表示文件,而是直接输入了一个固定的文件路径。
(3)、public void close() throws IOException   关闭操作
(4)、public int read(byte[] b) throws IOException 将内容读取到一个byte数组之中
(5)、public final byte readByte()  throws IOException 读取一个字节
(6)、public final int readInt()  throws IOException从文件中读取整型数据。
(7)、public void seek(long pos) throws IOException 设置读指针的位置。
(8)、public final void writeBytes(String s) throws IOException 将一个字符串写入到文件之中,按字节的方式处理。
(9)、public final void writeInt(int v) throws IOException 将一个int型数据写入文件,长度为4位。
(10)、public int skipBytes(int n) throws IOException 指针跳过多少个字节。
(11)、public void seek(long offset) throws IOException 移动指针到文件的某个位置
(12)、构造:public RandomAccessFile(File file, String mode)  throws FileNotFoundException实例化此类的时候需要传递File类,告诉程序应该操作的是哪个文件,之后有一个模式,文件的打开模式,常用的两种模式:
r:读模式
w:只写
rw:读写,如果使用此模式,如果此文件不存在,则会自动创建。
三、相关代码
1,向服务器获取文件大小的代码:
private long getContentLength(String url) {
    Request request = new Request.Builder().url(url).build();
    Call call = client.newCall(request);
    try {
        Response response = call.execute();
        if (response != null && response.body() != null && response.code() == 200) {
            long length = response.body().contentLength();
            response.close();
            return length;
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
    return -1;
}
    2、文件下载代码
private void downLoad(String url) {
    Request request = null;//请求体
    Call call = null;
    File file = null;//文件保存目录
    Response response = null;//请求响应
    InputStream inputStream = null;
    RandomAccessFile accessFile = null;//随机文件,可以自由移动文件开始位置
    long startIndex = 0;//文件下载开始位置
    try {
        file = new File(context.getExternalCacheDir(), Md5Utils.md5(url) + ".tmp");
        accessFile = new RandomAccessFile(file, "rwd");
        if (file.exists()) { //如果当前文件夹存在
            long read = accessFile.length();//获取已经下载文件的大小
            startIndex = read;
        }
        long total = getContentLength(url);
        Log.e("STARTINDEX", startIndex + "  total: " + total);
        if (startIndex == total) {
            return;
        }
        request = new Request.Builder().header("RANGE", "bytes=" + startIndex + "-" + total).url(url).build();
        call = client.newCall(request);
        response = call.execute();
        if (response != null && response.body() != null && response.code() == 206) {//206表示服务器支持断点续传
            inputStream = response.body().byteStream();
            accessFile.seek(startIndex);//移动到开始下载得位置
            byte[] blocks = new byte[50 * 1024];
            int len = -1;
            while ((len = inputStream.read(blocks)) > 0) {
                accessFile.write(blocks, 0, len);
            }
            accessFile.close();
            inputStream.close();
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
OkHttp是一个开源的HTTP客户端库,用于在Android和Java应用程序中进行网络请求它提供了丰富的功能和易于使用的API,其中包括支持断点下载。 在OkHttp中实现断点下载可以通过以下步骤完成: 1. 创建OkHttpClient对象:首先,你需要创建一个OkHttpClient对象,它将用于发送HTTP请求。你可以使用默认的OkHttpClient实例,也可以根据需要进行自定义配置。 2. 创建Request对象:接下来,你需要创建一个Request对象,其中包含了你要下载的文件的URL。你可以使用Request.Builder来构建Request对象,并设置一些额外的参数,如请求头、请求方法等。 3. 设置Range头部:为了实现断点下载,你需要在请求头中设置Range头部。Range头部指定了服务器应该返回文件的哪个部分。你可以通过设置Range头部来指定下载的起始位置和结束位置。 4. 发送请求并处理响应:使用OkHttpClient发送请求,并获取响应。在响应中,你可以获取到文件的总大小和内容。 5. 保存文件:根据响应中的内容,你可以将文件保存到本地。如果是断点下载,你需要将新下载的内容追加到已有的文件中。 下面是一个简单的示例代码,演示了如何使用OkHttp进行断点下载: ```java OkHttpClient client = new OkHttpClient(); // 创建Request对象 Request request = new Request.Builder() .url("http://example.com/file.txt") .header("Range", "bytes=500-") // 设置Range头部,从第500字节开始下载 .build(); // 发送请求并获取响应 Response response = client.newCall(request).execute(); // 获取响应中的输入流 InputStream inputStream = response.body().byteStream(); // 创建文件输出流 FileOutputStream outputStream = new FileOutputStream("path/to/save/file.txt", true); // 追加模式 // 读取输入流并写入文件 byte[] buffer = new byte[4096]; int bytesRead; while ((bytesRead = inputStream.read(buffer)) != -1) { outputStream.write(buffer, 0, bytesRead); } // 关闭流 outputStream.close(); inputStream.close(); ``` 请注意,上述代码仅为示例,实际使用时需要根据你的需求进行适当的修改和错误处理。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值