java中的字节流和字符流的存储区别

<script language="JavaScript" src="http://www.itwis.com/ad/gg300.js" type="text/JavaScript"> </script> <script type="text/javascript"> // //]]> </script> <script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript"> </script> <script src="http://pagead2.googlesyndication.com/pagead/expansion_embed.js" type="text/javascript"> </script> <script src="http://googleads.g.doubleclick.net/pagead/test_domain.js" type="text/javascript"> </script> <script type="text/javascript"> // </script> id="google_ads_frame1" style="LEFT: 0pt; POSITION: absolute; TOP: 0pt" name="google_ads_frame" marginwidth="0" marginheight="0" src="http://googleads.g.doubleclick.net/pagead/ads?client=ca-pub-2332246972783672&output=html&h=250&slotname=3989893535&w=300&lmt=1256199574&flash=10.0.22&url=http%3A%2F%2Fwww.itwis.com%2Fplus%2Fview.php%3Faid%3D1367&dt=1256199575547&correlator=1256199575549&frm=0&ga_vid=999595126.1256199576&ga_sid=1256199576&ga_hid=1213324584&ga_fc=0&u_tz=480&u_his=1&u_java=0&u_h=800&u_w=1280&u_ah=769&u_aw=1280&u_cd=32&u_nplug=13&u_nmime=34&biw=1280&bih=613&ref=http%3A%2F%2Fwww.google.cn%2Fsearch%3Fhl%3Dzh-CN%26client%3Dfirefox-a%26channel%3Ds%26rls%3Dorg.mozilla%253Azh-CN%253Aofficial%26hs%3DF1D%26newwindow%3D1%26q%3DJava%25E4%25B8%25AD%25E7%259A%2584char%2BUTF-16%2BBig%26btnG%3DGoogle%2B%25E6%2590%259C%25E7%25B4%25A2%26aq%3Df%26oq%3D&fu=0&ifi=1&dtd=319&xpc=u50kdI2tgn&p=http%3A//www.itwis.com" frameborder="0" width="300" scrolling="no" height="250">
java中的字节流和字符流的存储区别,用几个常用类型的 数据 来比较字节流和字符流的区别
int a=5;
boolean b=true;
char c='G';
String d="你好";
 
使用字符流打印以上类型的数据到文件中:
PrintWriter dos =new PrintWriter(new BufferedWriter(new FileWriter("c://buffertest.txt")));
dos.print(a);
dos.print(b);
dos.print(c);
dos.print(d);
 
结果如下:
a是5
b是true
c是G
d是你好
字符流完全保证了和我们输入的字符保持一致
 
再看看字节流
DataOutputStream dos =new DataOutputStream(new FileOutputStream("c://streamtest.txt"));
dos.writeInt(a);
dos.writeBoolean(b);
dos.writeChar(c);
dos.writeUTF(d);
dos.writeChars(d);
dos.writeBytes(d);
 
结果是二进制文件,我们用十六进制编辑器打开它
a是00 00 00 05,int是四个字节
b是01,布尔型变量是一个字节
c是00 47,char是两个字节
d分别用3个不同的函数打印在文件中
第一个是00 06 E4 BD A0 E5 A5 BD,前面的00 06是writeUTF加上去的,是字节的数目,后面六个字节是"你好"的UTF编码,每个汉字3个字节
第二个是4F 60 59 7D,这是"你好"的big endian的Unicode编码,每个汉字2个字节
第三个是60 7D,这是从4F 60 59 7D中分别取得两个汉字的低字节
 
进一步说明
用记事本保存不同的编码文件,文件的 头部 会有一些标记来识别文件的编码类型,用记事本的另存为就可以保存不同编码类型的文件,然后用记事本打开时就可以正确识别编码,如果用十六进制编辑器打开它们就会看到用来识别编码类型的标记被写在文件头部,这些类型说明如下:
EF BB BF UTF-8
FF FE UTF-16/UCS-2, little endian
FE FF UTF-16/UCS-2, big endian
FF FE 00 00 UTF-32/UCS-4, little endian.
00 00 FE FF UTF-32/UCS-4, big-endian.
 
UTF-8保存一个字符时,长度为1-3个字节,也就是8bit-24bit。
其中code<= 007F的,保存为1个字节
(code >= 0080) && (code <= 0x07FF)的,保存为2个字节
code>0800的,保存为3个字节

"你好"的gb2312编码是C4 E3 BA C3,汉字大于0800,所以每个汉字保存为3个字节
 
little endian:低地址存放字节低位,x86是这种顺序
big endian:低地址存放字节高位,网络字节序是这种顺序
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值