资讯专栏INFORMATION COLUMN

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

Scorpion / 1022人阅读

摘要:中一个类型采用编码,大小占两个字节,可以表示一个中文字符中类型采用字符集,无法表示一个中文字符缓冲区实现原理字节流本质上是直接与慢速存储设备进行,速度较慢。从字节流中恢复一个对象,称之为对象反序列化。

字符编码/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系统中,

字节流基类:InputStreamOutputStream

字符流基类:ReaderWriter

字节流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

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/67079.html

相关文章

  • Java IO

    摘要:分类一按操作方式类结构字节流和字符流字节流以字节为单位,每次次读入或读出是位数据。该对象并不是流体系中的一员,其封装了字节流,同时还封装了一个缓冲区字符数组,通过内部的指针来操作字符数组中的数据。 分类一:按操作方式(类结构) 字节流和字符流: 字节流:以字节为单位,每次次读入或读出是8位数据。可以读任何类型数据。 字符流:以字符为单位,每次次读入或读出是16位数据。其只能读取字符类...

    Salamander 评论0 收藏0
  • Javaweb Q&A

    摘要:方法的参数不但可以使相对于上下文根的路径,而且可以是相对于当前的路径。如和都是合法的路径。 转发与重定向区别是什么 在调用方法上 转发 调用 HttpServletRequest 对象的方法 request.getRequestDispatcher(test.jsp).forward(req, resp); 重定向 调用 HttpServletResponse 对象的方法 res...

    hiyang 评论0 收藏0
  • 高薪程序员&面试题精讲系列22之说说Java的IO流,常用哪些IO流?

    摘要:一面试题及剖析今日面试题今天壹哥带各位复习一块可能会令初学者比较头疼的内容,起码当时让我很有些头疼的内容,那就是流。在这里壹哥会从两部分展开介绍流,即与流。除此之外尽量使用字节流。关闭此输入流并释放与流相关联的任何系统资源。 一. 面试题及剖析 1. 今日面试题 今天 壹哥 带各位复习一块可...

    fnngj 评论0 收藏0
  • JAVA 学习IO流

    摘要:输出流从指定的字节数组写入个字节,从偏移开始输出到此输出流将字节从指定的字节数组写入此输出流。字符流输入流将字符读入数组的一部分。关闭流并释放与之相关联的任何系统资源。写一个字符串的一部分。 IO流 1.流流动、流向 从一端移动到另一端 源头与目的地,程序与文件|数组|网络连接|数据库,以程序为中心2.IO流分类流向 输入流 输出流 数据 字节流:二进制,可以是一切文件包括纯文本...

    wslongchen 评论0 收藏0
  • java 基础 - 收藏集 - 掘金

    摘要:基础知识复习后端掘金的作用表示静态修饰符,使用修饰的变量,在中分配内存后一直存在,直到程序退出才释放空间。将对象编码为字节流称之为序列化,反之将字节流重建成对象称之为反序列化。 Java 学习过程|完整思维导图 - 后端 - 掘金JVM 1. 内存模型( 内存分为几部分? 堆溢出、栈溢出原因及实例?线上如何排查?) 2. 类加载机制 3. 垃圾回收 Java基础 什么是接口?什么是抽象...

    makeFoxPlay 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<