断点续传了解

所谓断点续传,也就是要从文件已经下载的地方开始继续下载。所以在客户端浏览器传给 wen 服务器的时候要多加一条信息即:从哪里开始的问题。

假设:我们从服务器下载一个文件,需要从 2000070 这个字节后开始下载,之前已经下载过了,注意查看以下代码:

1
2
3
4
5
6
7
get /down.zip http/1.0

user-agent: netfox

range: bytes=2000070-//新增加字段,range,这一行的意思就是告诉服务器我这个文件从2000070字节开始传输,前面的字节就不用传了。

accept: text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2

服务器收到这条信息,就开始返回信息:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
206 //注意此时服务器的返回码不再是200而是206

content-length=106786028

content-range=bytes 2000070-106786027/106786028 //这行也是服务器新增加字段,返回的字节是从2000070-106786027 之间的字节,之前的字节就不传了。

date=mon, 30 apr 2001 12:55:20 gmt

etag=w/"02ca57e173c11:95b"

content-type=application/octet-stream

server=microsoft-iis/5.0

last-modified=mon, 30 apr 2001 12:55:20 gmt

以上差不多就是断点续传需要知道的知识和大致的原理。

  • 问题

    用什么方法实现提交 range:bytes=2000070-

使用最原始的 socket 肯定可以完成,不过很费事,用java的net包中提供了设置的方法,如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
try {
URL url = new URL("http://www.baidu.com");
try {
HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();
//通过设置requestProperty
httpURLConnection.setRequestProperty("rande","bytes=2000070");
//这样获取的输入流就是从2000070这个字节后开始的
InputStream input = httpURLConnection.getInputStream();

} catch (IOException e) {
e.printStackTrace();
}
} catch (MalformedURLException e) {
e.printStackTrace();
}

接下来:获取到流了,那么如何从流保存到文件中去呢?

保存文件的方法,采用的是 io 包中的 randomacessfile 类。如下代码:

1
2
3
4
5
6
7
//上面文件已经获取到 inputStream--input
RandomAccessFile saveFile = new RandomAccessFile("down.zip","rw");//down.zip下载文件名称
saveFile.seek(2000070);//定位文件指针到这个 2000070 位置
byte[] b= new byte[1024];
int read;
while((read = input.read(b,0,1024))>0){
saveFile.write(b,0,read);

基本大概就是这样。

-------------本文结束感谢您的阅读-------------