1. 首页
  2. IT资讯

Java程序员必看之如何深入理解字符流的编码?

“u003Cdivu003Eu003Cp class=”ql-align-justify”u003EJava中是以流的形式来实现数据在网络中的传输,而所说的“流”则是字节流。因为所有的数据的最底层都是以字节为单位存储的,所以以字节为单位传输数据无疑是最简单也是最有效的传输方式。u003Cu002Fpu003Eu003Cdiv class=”pgc-img”u003Eu003Cimg src=”http:u002Fu002Fp3.pstatp.comu002Flargeu002Fdfic-imagehandleru002Fcb1eabc5-e10e-419c-8519-d66ed7b0e783″ img_width=”1200″ img_height=”960″ alt=”Java程序员必看之如何深入理解字符流的编码?” inline=”0″u003Eu003Cp class=”pgc-img-caption”u003Eu003Cu002Fpu003Eu003Cu002Fdivu003Eu003Cp class=”ql-align-justify”u003E我们在学习Java的过程中,也经常接触字符流,字符流顾名思义则是以字符为单位进行数据传输,但是其实字符流的应用面是很窄的,并不是所有的文件都存在字符的概念的,比如视频文件、音频文件、图片文件,这些是无法以字符为单位进行传输的。字符流只能对文本字符进行操作。u003Cu002Fpu003Eu003Cp class=”ql-align-justify”u003E提到字符,我们首先就会想到的是编码,因为计算机存储的是字节,我们看到的却是字符,这之间是靠编码表对应起来的,那么这也就是本篇文章索要研究的内容—字符流编码。u003Cu002Fpu003Eu003Cp class=”ql-align-justify”u003E首先我们来看下面的案例:u003Cu002Fpu003Eu003Cdiv class=”pgc-img”u003Eu003Cimg src=”http:u002Fu002Fp9.pstatp.comu002Flargeu002Fpgc-imageu002Fed0061fbf0aa4c5e8461c56556d1075c” img_width=”1039″ img_height=”573″ alt=”Java程序员必看之如何深入理解字符流的编码?” inline=”0″u003Eu003Cp class=”pgc-img-caption”u003Eu003Cu002Fpu003Eu003Cu002Fdivu003Eu003Cp class=”ql-align-justify”u003E案例显示,Demo.java的项目编码和b.txt的编码格式一样,则能够正常写入,不会乱码。原理如下图所示:u003Cu002Fpu003Eu003Cdiv class=”pgc-img”u003Eu003Cimg src=”http:u002Fu002Fp9.pstatp.comu002Flargeu002Fpgc-imageu002Fddd291493d0045ebbd608ff8afed814b” img_width=”1091″ img_height=”635″ alt=”Java程序员必看之如何深入理解字符流的编码?” inline=”0″u003Eu003Cp class=”pgc-img-caption”u003Eu003Cu002Fpu003Eu003Cu002Fdivu003Eu003Cp class=”ql-align-justify”u003E字符流,每一个字符流都存在一个缓冲区,缓冲区的编码格式是和项目的编码格式一致的,上述代码执行流程是:字符串“黑马”在FileWriter的缓冲区里面通过GBK编码把汉字编码成对应的字节,然后底层通过字节流将字节写入到b.txt。 很多人我们打开b.txt时看到的是“黑马”这两个字啊,并不是什么码值啊。其实所有文件的底层都是字节,子不过我们打开b.txt时,记事本软件就通过此文件的编码—GBK帮我们把码值解码成“黑马”这两个字了,所以我们看到的是黑马。照这样看来,如果b.txt的文件编码是UTF-8的话,肯定就会乱码,因为记事本会按照UTF-8进行解码,效果如下图所示:u003Cu002Fpu003Eu003Cdiv class=”pgc-img”u003Eu003Cimg src=”http:u002Fu002Fp1.pstatp.comu002Flargeu002Fpgc-imageu002Fdf3990b3b1244815a1ef53c55d9cc8c2″ img_width=”894″ img_height=”558″ alt=”Java程序员必看之如何深入理解字符流的编码?” inline=”0″u003Eu003Cp class=”pgc-img-caption”u003Eu003Cu002Fpu003Eu003Cu002Fdivu003Eu003Cp class=”ql-align-justify”u003E接下来难点才真正的来临(很多人看了下面的代码和运行效果就蒙圈),我们把上图的代码改下(其他编码格式不变),你会发现不乱码了,如下图:源码如下:u003Cu002Fpu003Eu003Cdiv class=”pgc-img”u003Eu003Cimg src=”http:u002Fu002Fp1.pstatp.comu002Flargeu002Fpgc-imageu002F51213f6c2adc4fc0b237cb7ab3d28c7a” img_width=”947″ img_height=”550″ alt=”Java程序员必看之如何深入理解字符流的编码?” inline=”0″u003Eu003Cp class=”pgc-img-caption”u003Eu003Cu002Fpu003Eu003Cu002Fdivu003Eu003Cp class=”ql-align-justify”u003Epublic class Demo {[u002Falign]u003Cu002Fpu003Eu003Cp class=”ql-align-justify”u003Epublic static void main(String[] args) throws IOException {u003Cu002Fpu003Eu003Cp class=”ql-align-justify”u003EFileWriter fw = new FileWriter(“b.txt”);u003Cu002Fpu003Eu003Cp class=”ql-align-justify”u003EString s = “黑马”;u003Cu002Fpu003Eu003Cp class=”ql-align-justify”u003Ebyte[] bytes = s.getBytes(“UTF-8″);u003Cu002Fpu003Eu003Cp class=”ql-align-justify”u003EString s1 = new String(bytes);u003Cu002Fpu003Eu003Cp class=”ql-align-justify”u003Efw.write(s1);u003Cu002Fpu003Eu003Cp class=”ql-align-justify”u003Efw.close();u003Cu002Fpu003Eu003Cp class=”ql-align-justify”u003E}u003Cu002Fpu003Eu003Cp class=”ql-align-justify”u003E}u003Cu002Fpu003Eu003Cp class=”ql-align-justify”u003E很多人蒙圈的原因是因为,先把字符转为了UTF-8 但是又通过new String(bytes)转成了GBK啊,但是b.txt是UTF-8格式的编码啊。为什么没有乱码呢? 下图解释的很详细:u003Cu002Fpu003Eu003Cdiv class=”pgc-img”u003Eu003Cimg src=”http:u002Fu002Fp1.pstatp.comu002Flargeu002Fpgc-imageu002Fd2139e61a3594925ac54797b76fe3c8a” img_width=”1355″ img_height=”632″ alt=”Java程序员必看之如何深入理解字符流的编码?” inline=”0″u003Eu003Cp class=”pgc-img-caption”u003Eu003Cu002Fpu003Eu003Cu002Fdivu003Eu003Cp class=”ql-align-justify”u003E执行流程是:先通过UTF-8编码把“黑马”编码成几个字节比如13 42 35 86 59 47,然后再通过GBK编码,把该码值解码成对应的字符比如“传智人”,然后“传智人”进入缓冲区会通过GBK编码编码成刚才的字节 也就是13 42 35 86 59 47,然后再通过字节流写入到b.txt中,当打开b.txt时,记事本软件会按照此文件编码格式-UTF-8解码成“黑马”,所以我们看到的是没有乱码。u003Cu002Fpu003Eu003Cp class=”ql-align-justify”u003E总结:通过比价复杂的案例我们明白了一、每个字符流都存在缓冲区,而且缓冲区的编码是和项目编码一致。二、字符流的底层依然是使用的字节流,而且还存在缓冲区的编码动作,所以效率比字节流会慢很多,所以通常数据的传输我们都会使用字节流。三、文本文件的底层存储的也是字节,我们打开文件看到的字符,是记事本软件所做的解码。u003Cu002Fpu003Eu003Cu002Fdivu003E”

原文始发于:Java程序员必看之如何深入理解字符流的编码?

主题测试文章,只做测试使用。发布者:玩家L-,转转请注明出处:http://www.cxybcw.com/26860.html

联系我们

13687733322

在线咨询:点击这里给我发消息

邮件:1877088071@qq.com

工作时间:周一至周五,9:30-18:30,节假日休息

QR code