javahttp传输⼆进制流_字符流、字节流、⼆进制及其在HTTP
协议传输
⼀、⼆进制、字节、字符流概念
字(Byte)节是长度单位。位(bit)也是长度单位。
计算机通信和存储的时候都是以010101这样的⼆进制数据为基础的
⼆进制数有两个特点:它由两个基本字符0,1组成,⼆进制数运算规律是逢⼆进⼀。
在程序中所有的数据都是以流的⽅式进⾏传输或保存的,程序需要数据的时候要使⽤输⼊流读取数据,⽽当程序需要将⼀些数据保存起来的时候,就要使⽤输出流完成。
程序中的输⼊输出都是以流的形式保存的,流中保存的实际上全都是字节⽂件。
在java.io包中操作⽂件内容的主要有两⼤类:字节流、字符流,两类都分为输⼊和输出操作。在字节流中输出数据主要是使⽤OutputStream完成,输⼊使的是InputStream,在字符流中输出主要是使⽤Writer类完成,输⼊流主要使⽤Reader类完成。(这四个都是抽象类)
java中提供了专⽤于输⼊输出功能的包Java.io,其中包括:
InputStream,OutputStream,Reader,Writer
InputStream 和OutputStream,两个是为字节流设计的,主要⽤来处理字节或⼆进制对象,
Reader和 Writer.两个是为字符流(⼀个字符占两个字节)设计的,主要⽤来处理字符或字符串.
字符流处理的单元为2个字节的Unicode字符,分别操作字符、字符数组或字符串,⽽字节流处理单元为1个字节,操作字节和字节数组。所以字符流是由Java虚拟机将字节转化为2个字节的Unicode字符为单位的字符⽽成的,所以它对多国语⾔⽀持性⽐较好!如果是⾳频⽂件、图⽚、歌曲,就⽤字节流好点,如果是关系到中⽂(⽂本)的,⽤字符流好点
unicode编码转换二进制
所有⽂件的储存是都是字节(byte)的储存,在磁盘上保留的并不是⽂件的字符⽽是先把字符编码成字节,再储存这些字节到磁盘。在读取⽂件(特别是⽂本⽂件)时,也是⼀个字节⼀个字节地读取以形成字节序列
字节流可⽤于任何类型的对象,包括⼆进制对象,⽽字符流只能处理字符或者字符串; 2. 字节流提供了处理任何类型的IO操作的功能,但它不能直接处理Unicode字符,⽽字符流就可以
字节流是最基本的,所有的InputStrem和OutputStream的⼦类都是,主要⽤在处理⼆进制数据,它是按字节来处理的 但实际中很多的数据是⽂本,⼜提出了字符流的概念,它是按虚拟机的encode来处理,也就是要进⾏字符集的转化 这两个之间通过
InputStreamReader,OutputStreamWriter来关联,实际上是通过byte[]和String来关联 在实际开发中出现的汉字问题实际上都是在字符流和字节流之间转化不统⼀⽽造成的。
⼆、HTTP协议数据传输
通常上的理解,http协议中请求、相应都是以ascii字符⽅式传输,如果要传输⼆进制需要经过BASE64或MIME等编码(因为HTTP协议pop3、smtp邮件协议都是针对⽂本的,⽽FTP⽀持传输⼆进制数据,即不需要经过编码转换成字符型数据)
如果直接使⽤http传输⼆进制(不经过base64编码),可能会造成⼀下问题:
1) 不知道传输字节的具体长度,如传输的int类型,将int类型之间转为char以后,丢失掉了长度的信息,如数字1234567,本来只有4个字节,但是转化成⽂本的“1234567”是有7个字节。在int类型的时候固然好办,但是⼀个数组的时候,经过转化以后,在转化回来就很⿇烦了。
2) 对于⼀些数字,⼆进制传输Server是没法处理的。如int 1,⼆进制数据是0x00000001,按字节传输的
时候,client能够正常发送,但是libevent收到以后,在抛给libevent_http层是,会把数据截断,前两位0x00是字符串的停⽌符。
HTTP请求头和响应头都是以ASCII⽂本⽅式传输的,但是传输内容(请求响应体)可能是多种形式的。接收⽅处理数据时是根据请求头/响应头中的content-type属性来处理的。 Content-Type:image/gif 这说明传输的是⼀个image对象(⼆进制数据),该对象为gif格
式,Content-length:91 这说明传输的数据⼤⼩为91个字节,响应头若没有Transfer-Encoding这个字段,说明传输的数据没有经过任何形式的编码转换,传输的就是源⽂件的内容。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。