字符编码/Java字符流与字节流/Buffer原理/对象序列化
声明
文章均为本人技术笔记,转载请注明出处https://segmentfault.com/u/yzwall
字符编码与编码标准
字符集:收入标准中的符号集合成为字符集
编码:将给定字符转换成底层存储字节的过程
ASCII编码
ASCII只支持英文编码,不支持其他语言;ASCII编码使用一个字节编码一个字符,一共规定了128
个字符,每个字符只占用一个字节的后7
位,第1
位统一为0
,
ANSI编码
与ASCII编码相对,非英语国家自定义适合本国语言的编码标准,使用多个字节存储一个字符。但是不同ANSI编码之间互不兼容,无法将不同语言的文字存储在同一段用ANSI编码的文本中;
Unicode编码
与ANSI编码相对,国际组织制定Unicode编码,为不同语言中的每个字符规定了统一而且唯一的数字编号,实现跨语言和跨平台;
大端存储与小端存储
大端存储:高位字节存储在低地址端,低位字节存储在高地址端;(高放低,低放高)
小端存储:低位字节存储在低地址端,高位字节存储在高地地端;(高放高,低放低)
网络传输和x86存储均采用大端存储;在Unicode规范中,根据文本文件的头两个字节,判定采用大端存储还是小端存储:
头两个字节是
FE FF
:大端存储;头两个字节是
FF FE
:小端存储;
Unicode实现方式:UTF-8
一个字符的Unicode编码是确定的,但是在实际传输过程中,有多种Unicode编码实现方式。Unicode实现方式成为Unicode转换格式(Unicode Transformation Format, UTF);UTF-8是应用最广的Unicode实现方式,使用1~4
个字节存储一个字符。Unicode其他实现形式包括UTF-16(单个字符用2
个或4
个字节表示)和UTF-32(单个字符用4
个字节表示)
UTF-8的编码规则
单字节字符:字节第一位为
0
,后7
位为该字符的Unicode编码。因此对于英文字符,UTF-8编码与ASCII编码相同;-
多字节字符(n > 1):
第一个字节的前n位全为
1
,第n+1
位设为0
;其余字节的前
2
位一律设为10
;其余二进制位全部为该字符的Unicode编码;
汉字编码
汉字编码主要有GBK,GB2312和Big5;
GB2312:GB2312由国家标准总局发布,是一个简化版的汉子编码规范,又称国标码。GB2312规定对任意一个字符采用2个字节存储,每个字节采用7位编码表示;
GBK:GBK是GB2312的扩展,兼容GB2312,每个汉字由2个字节存储;
Big5:Big5是繁体字编码,每个汉子由2个字节存储;
Java字节流与字符流
Java IO系统中,
字节流基类:InputStream和OutputStream
字符流基类:Reader和Writer
字节流I/O单位是单个字节,字符流I/O单位是是由JVM将单个字节解码后的Unicode字符,Java中实际运行的只有字节流,只有对字符流进行解码操作后才能得到字符流。
Java中一个char类型采用Unicode编码,大小占两个字节,可以表示一个中文字符;C/C++中char类型采用ASCII字符集,无法表示一个中文字符;
缓冲区Buffer实现原理
字节流本质上是CPU直接与慢速存储设备进行I/O,速度较慢。由于CPU与主存的I/O速度远远高于与慢速存储设备,因此在内存中开辟一段足够大空间称之为缓冲区(Buffer),系统每次尝试先从缓冲区中读取数据,如果读取失败则选择从后备存储中读取新数据放入缓冲区中,最后将缓冲区中对应数据返回给用户。
对象序列化
对象序列化与反序列化:将Java对象转变成字节流存储,称之为对象序列化。从字节流中恢复一个Java对象,称之为对象反序列化。
序列化资格:只有实现了Serializable
接口的对象,才可以被序列化。
序列化实现:通过ObjectOutputStream.writeObject(Object)
将对象Object序列化;
反序列化实现:通过ObjectInputStream.readObject()
反序列化一个对象;
序列化应用:对象序列化多用于分布式网络中通过RMI传输对象;
参考
[1] http://blog.csdn.net/sugar_z_/article/details/51276984
[2] http://www.ruanyifeng.com/blog/2007/10/ascii_unicode_and_utf-8.html
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。