您的位置:首页 > 移动开发 > Android开发

android上传下载系列:一般性知识解读

2016-08-03 17:49 288 查看
其实不论上传下载,底层都是流的操作

一.http头部

http协议之http消息头

消息头告诉对方这个消息是干什么的,消息体告诉对方怎么干。

http报文由从客户机到服务器的请求和从服务器到客户机的响应构成,所以http消息分为请求消息和响应消息两类。如下图所示:



每个请求消息和响应消息都有三个部分组成。

http请求消息

每一个http包分为http头和http体两部分,后者是可选的,而前者是必须的。例如,用户通过表单传给服务器的内容就是http体部分,而下面的内容就是看不见的http头部内容,例如如下:

GET/book/index.html/HTTP/1.1 请求行
Host:www.brophp.com 头部行
Connection:close 头部行
User-agent:Mazilla/4.0 头部行
Accept-language:Zh-cn 头部行


这个消息头是普通的ASCII文本,共有5行。当然,一个http请求信息可以不止这么多行,也可以仅有一行。该请求消息的第一行成为请求行,后续各行都成为头部行。请求行有3个字段:方法字段、url字段、http版本字段。方法字段有若干个值可供选择,包括GET\POST\HEAD。http请求消息绝大多数使用GET方法,这是浏览器用来请求对象的方法,所请求的对象就在URL字段中标识。本例表明浏览器在请求对象/book/index.html。版本字段在本例中浏览器实现的是http1.1版本。上例第二行开始的是各个头部行:头部行中Host:www.brophp.com 定义存放所请求对象的主机;Connection:close是在告知本浏览器不想使用持久连接,所以服务器发出所请求的对象后应关闭连接。User-agent头部行指定用户代理,也就是产生当前请求的浏览器的类型。上例中用的Mazilla/4.0,这个头部行很有用,因为服务器实际上可以给不同类型的用户代理发送同一个对象的不同版本。最后Accept-language头部行指出要是所请求对象有简体中文版本,如果没有这个语言版本,那么服务器应该发送其默认版本。

http响应消息

http响应消息是指服务器向客户端返回的消息,这个响应的http包也分为http头和http体两部分。每当我们打开一个网页,在上面单击右键,选择“查看源文件”时,看到的html代码就是http的消息体。那么消息头又在哪儿呢?浏览器不让我们看到这部分,但我们通过一些工具截取数据包等方法看到它。下面给出一个http的响应消息头:

HTTP/1.1 200 OK 状态行
Connection:close 头部行
Date:Thu, 13 Oct 2011 03:17:33 GMT 头部行
Server:Apache/2.2.9(Unix) 头部行
Last-Nodified:Mon, 22 Jun 2008 09;23;24 GMT 头部行
Content-Length:6821 头部行
Content-Type:text/html 头部行


本例中这个响应消息头分为三部分:第一行是一个起始的状态行,中间6行是头部行,最后一行是一个包含所请求对象本身的附属体。状态行有3个字段:协议版本字段、状态版本字段、状态码字段、原因短语字段。上例中的状态行表明,服务器使用http1.1版本,响应过程完全正常。

http请求头和响应头

这里列出了详细的区别

http://tools.jb51.net/table/http_header

/article/2458245.html

断点上传具体涉及的请求头

在说http断点续传之前需要重点了解http协议头部的Range字段

Range 用于请求头中,指定第一个字节的位置和最后一个字节的位置,一般格式:

Range:(unit=first byte pos)-[last byte pos]


二.RandomAccessFile

RandomAccessFile(随机访问文件流),也是一种文件的读写IO流,他实现了DataInputStream和DataOutputStream两个接口,因此他可以根据自己的方法实现对文件的读与写双重操作。

RandomAccessFile提供了一种类似于文件指针的东西,他可以随着你对文件的读或者写操作来进行指针的移动,从而实现对文件的随机读取。具体的获取及相关操作就要用到接下来的几种常用方法了。

RandomAccessFile是用来访问那些保存数据记录的文件的,你就可以用seek( )方法来访问记录,并进行读写了。这些记录的大小不必相同;但是其大小和位置必须是可知的。但是该类仅限于操作文件。

RandomAccessFile不属于InputStream和OutputStream类系的。实际上,除了实现DataInput和DataOutput接口之外(DataInputStream和DataOutputStream也实现了这两个接口),它和这两个类系毫不相干,甚至不使用InputStream和OutputStream类中已经存在的任何功能;它是一个完全独立的类,所有方法(绝大多数都只属于它自己)都是从零开始写的。这可能是因为RandomAccessFile能在文件里面前后移动,所以它的行为与其它的I/O类有些根本性的不同。总而言之,它是一个直接继承Object的,独立的类。

基本上,RandomAccessFile的工作方式是,把DataInputStream和DataOutputStream结合起来,再加上它自己的一些方法,比如定位用的getFilePointer( ),在文件里移动用的seek( ),以及判断文件大小的length( )、skipBytes()跳过多少字节数。此外,它的构造函数还要一个表示以只读方式(“r”),还是以读写方式(“rw”)打开文件的参数 (和C的fopen( )一模一样)。它不支持只写文件。

只有RandomAccessFile才有seek搜寻方法,而这个方法也只适用于文件。BufferedInputStream有一个mark( )方法,你可以用它来设定标记(把结果保存在一个内部变量里),然后再调用reset( )返回这个位置,但是它的功能太弱了,而且也不怎么实用。

RandomAccessFile的绝大多数功能,但不是全部,已经被JDK 1.4的nio的”内存映射文件(memory-mapped files)”给取代了,你该考虑一下是不是用”内存映射文件”来代替RandomAccessFile了。

三.多线程并发

参考资料

/article/8608879.html

Java IO: RandomAccessFile

http://ifeve.com/java-io-randomaccessfile/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐