java追加字符到buffer对象,字符编码/Java字符流与字节流/Buffer原理/对象序列化

字符编码/Java字符流与字节流/Buffer原理/对象序列化

声明

字符编码与编码标准

字符集:收入标准中的符号集合成为字符集

编码:将给定字符转换成底层存储字节的过程

0818b9ca8b590ca3270a3433284dd417.png

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的编码规则

0818b9ca8b590ca3270a3433284dd417.png

单字节字符:字节第一位为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

0818b9ca8b590ca3270a3433284dd417.png

字节流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传输对象;

参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值