Java I/O(一)字节流与字符流

转载请注明出处:http://blog.csdn.net/my_truelove/article/details/53758412

扫描左侧二维码,关注我的公众号,及时获取最新文章推送!


最近复习了一下Java的东西,看了看java.io包下的相关类,捋了捋。时间充裕,就总结出笔记和大家分享、探讨,还有许多有关Java 集合、Android动画的内容,后续有时间会第一时间更新。

本系列主要包括(后续可能会追加):

  1. 字节(流)、字符(流)的概念,很基础,但不懂的话就无法彻底理解Java IO;
  2. 从全局角度看Java IO框架,把常用的类归类,并进一步分析字节流和字符流,方便理解;
  3. 针对性的写几个例子,侧重点在于糅合所涉及的知识点,而不是列举API。

本文主要介绍第1点,最终是要弄懂字节流和字符流,为后面学习IO做铺垫,下面开始正文。

1. 字节和字符

在介绍字节流与字符流之前,我们先要明白什么是字节和字符,简单说下。

比特:在计算机中,信息量的最小单位是比特(bit),在计算机中表现为二进制数据(0、1),其中每一位占1bit。

字节:比特之上,就是字节(Byte),1个字节占8个比特,即1Byte = 8bit。

字符:字节组成字符,字符不是具体的计量单位,其表示一个字形、类字形或符号(标点、字母、汉字等)。字符之于字节,并不像字节之于比特一样,有固定的换算率。实际上,字符与字节的相互转化,会因为编码|解码标准的不同而存在差异。

2. 字节与字符的相互转化

通常,我们称从字符得到字节为编码,反之则为解码。编码和解码的过程,依赖于字符集(CharSet)。就好比汉语字典可以实现汉语和拼音的相互转化一样,字符集可以实现字节和字符的相互转化。

不同的编码有自己对应的字符集,以实现字节和字符的转换,常见的编码方式包括但不限于ASCII码、Unicode码(UTF-8,UTF-16)等,感兴趣的自己了解下,推荐一篇知乎有关编码的介绍(https://www.zhihu.com/question/23374078/answer/69732605)。

下面,我根据自己理解大概总结一下:

  1. 在ASCII码中,1个字符对应1个字节,即8位,起初使用其中低7位表示字符,共可以表示128个字符(准确来说是英文)。因这128个字符仅能支持英文,所以ASCII不支持中文编码,会出现乱码。

  2. Unicode码是为了解决ASCII的局限、以及全球众多混乱的编码而诞生的,旨在指定统一的标准,其规定采用2个字节,也就是16位来表示所有字符。我们分为两步去理解它,第一步是制定标准,给所有字符指定对应的数字(2个字节16位,可以表示0~65535),第二步才是将其存储到计算机上以形成数字和字符的对应关系。由于英文始终只需要占用一个字节,这样高8位的字节将全是0,势必会导致空间的浪费,是不利于在互联网传输的。

  3. UTF-16:互联网传输方式的一种,可以认为就是Unicode的本体,但它俩不是一个概念,UTF(UCS Transfer Format)系列是专门为了解决传输而设计。UTF-16使用固定的2个字节(即16位)表示字符,最多支持65536个字符,可以很好的兼容中文的编码。但缺点就是浪费空间,占用带宽。

  4. UTF-8:UTF-8就是在互联网上使用最广的一种unicode的实现方式,刚说了是为传输而设计的编码,UTF-8最大的一个特点,就是它是一种变长的编码方式。它可以使用1~4个字节表示一个符号,根据不同的符号而变化字节长度,当字符在ASCII 码的范围时,就用一个字节表示,保留了ASCII字符一个字节的编码做为它的一部分。要知道,从unicode到uft-8并不是直接的对应,而是要过一些算法和规则来转换。

3. 字节流和字符流

了解了字节和字符,以及相互转换后,下面看看字节和字符在Java中的传输、存储。Java程序中,所有的数据在硬盘读写或在传输时都是以字节的形式进行的,包括文本、图片、音视频等,因此,字节流的使用较为广泛。

然而,实际开发中涉及很多文本数据,若直接使用字节将无法辨识,于是提出了字符流的概念,Java中的字符流借助JVM的encode(编码)和decode(解码)来对字符和字节进行相互转化。需要注意的是,字符只有在内存中才会形成,在网络传输、本地存储的永远都是字节。下一篇文章将结合Java IO框架,对字符流和字节流的实现、关系,做进一步介绍。

在一般情况下,我们使用字节流处理图片、音视频等文件,若涉及文本,建议采用字符流操作。

4. 结束

其实,开发中的网络请求、图片缓存、附件上传下载等,都涉及流的知识,但大家几乎都依赖于三方库,导致对这块知识很生疏,希望本文能为你提供些许帮助,捡起来本该掌握的技能。

同时,若文中有任何不严谨或不正确的地方,还望不吝指正。欢迎关注我的公众号:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值