前言
作为一个拖延者晚期的人,真的是计划跟行动力很难直接挂上钩,最近又有了新的打算,所以博客还是需要好好整理一下.
这次主要是运用的RandomAccessFile类来做 断点续传这件事,我一贯喜欢代码简洁清晰,所以尽可能用最少的代码解决问题.
断点续传原理及使用
断点续传想必大家都不陌生,其中最常见的是视频的断点续传,在其他的文件下载中,我们有时候为了保证下载文件的完整性也会用到RandomAccessFile类。
RandomAccessFile主要是记录开始的位置,从而进行插入操作.
官方的翻译如下:
RandomAccessFile是不属于InputStream和OutputStream类系的。实际上,除了实现DataInput和DataOutput接口之外(DataInputStream和DataOutputStream也实现了这两个接口),它和这两个类系毫不相干,甚至都没有用InputStream和OutputStream已经准备好的功能;它是一个完全独立的类,所有方法(绝大多数都只属于它自己)都是从零开始写的。这可能是因为RandomAccessFile能在文件里面前后移动,所以它的行为与其它的I/O类有些根本性的不同。总而言之,它是一个直接继承Object的,独立的类.
RandomAccessFile类API方法分析
- 构造方法
- RandomAccessFile(File file, String mode)
- RandomAccessFile(String name, String mode)
- 常用方法
- 流关闭
- close()
- 获取文件的长度
- length()
- 设置文件的长度
- setLength(long newLength)
- 设置文件指针的开始偏移位置
- seek(long pos)
- 读操作
- read()
- read(byte[] b)
- read(byte[] b, int off, int len)
- 写操作
- write(byte[] b)
- write(byte[] b, int off, int len)
- 流关闭
代码实例
在写实例之前,说一下现在要实现的功能以及实现的基本思路.
- 功能
- http下载文件,允许开始下载,暂停下载,恢复下载和取消下载
- 实现思路.
- 需要先获取该文件的大小,创建一个空的文件,然后向该文件中依次写入数据.
实现类 HttpDownLoadFile
(测试功能正常,机型:Meizu M1 Metal Android 5.1)
import android.content.Context;
import android.content.SharedPreferences;
import android.os.Handler;
import android.os.Message;
import java.io.InputStream;
import java.io.RandomAccessFile;
import java.net.HttpURLConnection;
import java.net.URL;
/**
* 多线程下载文件
*/
public class HttpDownLoadFile {
private static final String SP_NAME = "http_download_file";
private static final String CURRENT_LENGTH = "current_length";
//以下为线程状态
private static final String DOWNLOAD_INIT = "1";//初始
private static final String DOWNLOAD_ING = "2";//运行
private static final String DOWNLOAD_PAUSE = "3";//暂停
private String loadUrl;//网络获取的url
private String filePath;//下载到本地的path
private int fileLength;//文件总大小
//使用volatile防止多线程不安全
private volatile int currentLength;//当前总共下载的大小
private Thread thread;
private String stateDownload = DOWNLOAD_INIT;//当前线程状态
private OnHttpDownLoadListener httpDownLoadListener;
private final int SUCCESS = 0x00000101;
private final int FAILURE = 0x00000102;
private SharedPreferences sp;
public void setOnHttpDownLoadListener(OnHttpDownLoadListener httpDownLoadListener) {
this.httpDownLoadListener = httpDownLoadListener;
}
public interface OnHttpDownLoadListener {
//返回当前下载进度的百分比
void onProgress(int progress);
void onComplete();
void onFailure()