A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 黄鸿达 中级黑马   /  2013-3-2 18:39  /  2002 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 黄鸿达 于 2013-3-11 17:58 编辑
  1. import java.io.*;
  2. public class a {
  3.         
  4.         public static void main(String[] args) throws Exception {
  5.                 String s="阿a√";//11.txt存的是这3个字符  阿a√   编码模式不是utf-8是默认那个ascii
  6.                 char[] carr=s.toCharArray();
  7.                
  8.                 for(int x=0;x<carr.length;x++){
  9.                         System.out.println(carr[x]);
  10.                         System.out.println((int)carr[x]);
  11.                         
  12.                 }
  13.                 System.out.println("-----------------------------------");
  14. //第一个流
  15.                 FileInputStream f=new FileInputStream("D:\\11.txt");
  16.                 FileOutputStream fo=new FileOutputStream("D:\\33.txt");
  17.                 int num=0;
  18.                 while((num=f.read())!=-1){
  19.                         System.out.println("整数"+num);
  20.                         System.out.println("二进制"+Integer.toBinaryString(num));
  21.                         fo.write(num);
  22.                 }
  23.                 System.out.println("-----------------------------------");
  24.   //第2个流
  25.                 InputStreamReader isr=new InputStreamReader(
  26.                                 new FileInputStream("D:\\11.txt"),"GBK");
  27.                 OutputStreamWriter osw=new OutputStreamWriter(
  28.                                 new FileOutputStream("D:\\22.txt"),"GBK");
  29.                 int num1=0;
  30.                 while((num1=isr.read())!=-1){
  31.                         System.out.println("整数"+num1);
  32.                         System.out.println("二进制"+Integer.toBinaryString(num1));
  33.                         osw.write(num1);
  34.                         
  35.                 }

  36.                 fo.close();
  37.                 f.close();
  38.                 isr.close();
  39.                 osw.close();
  40.         }

  41. }
复制代码

  1. 38463
  2. a
  3. 97

  4. 8730
  5. -----------------------------------
  6. 整数176
  7. 二进制10110000
  8. 整数162
  9. 二进制10100010
  10. 整数97
  11. 二进制1100001
  12. 整数161
  13. 二进制10100001
  14. 整数204
  15. 二进制11001100
  16. -----------------------------------
  17. 整数38463
  18. 二进制1001011000111111
  19. 整数97
  20. 二进制1100001
  21. 整数8730
  22. 二进制10001000011010
复制代码
我不懂的是  第一个流用得平台默认编码读取,我是WIN中文的所以默认编码是GBK,第二个流用得是指定编码GBK,应该2个读取的数据是一样的,但是结果不一样
第一个10110000 10100010是这个    第二个是这个10010110 00111111 ,我查过GBK编码表,第一个是对的。所以第二个不属于GBK。
通过

38463
a
97

8730
这个打印结果知道其实第二个是unicode的编码,但是为什么我用GBK读,就读出来unicode的编码?

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1 赞一个!

查看全部评分

3 个回复

倒序浏览
本帖最后由 李志卫 于 2013-3-3 01:59 编辑

1,String s="阿a√"; 这里阿a√ 是GBK的编码的字符串。 你文件上的阿a√ 是ASCII码储存,按GBK码表显示的文本。记事本默认用GBK打开,一般。因为GBK可以向下兼容ASCII码,还能显示中文。
2、 第一个流既然你是用ASCII码储存的,那么字节流读取的就是一ASCII形式储存的字节,字节流只会按照硬盘上的字节数据读取,和什么编码没什么干系。
3、第二个流,以GBK读取文本文件,按道理都应该以GBK的编码显示。这里也和上面字符串返回的整数一样。 Unicode的字符都是两个字节表示,这里不可能是Unicode码显示的,你的“a”才用一个字节显示。 我试了下,也不会是UTF-8的编码。

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1 很给力!

查看全部评分

回复 使用道具 举报
第二个确实是Unicode编码,原因如下:

Java中所有的字符、字符串都是Unicode编码,字符读取流读取出来的数据都是Unicode编码,不管你的文件是什么编码,到Java中都是Unicode编码(中间有一个转换过程)

字节读取流读取的字节会保持原编码

在你的例子中,第一个是gbk编码,第二个是Unicode编码


Unicode: 963F  1001 0110  0011 1111
GBK:      B0A2  1011 0000  1010 0010

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 黄鸿达 于 2013-3-3 21:39 编辑
吴硕 发表于 2013-3-3 16:52
第二个确实是Unicode编码,原因如下:

Java中所有的字符、字符串都是Unicode编码,字符读取流读取出来的数 ...
  1.                 System.out.println("-----------------------------------");
  2.                
  3.                 InputStreamReader isr=new InputStreamReader(
  4.                                 new FileInputStream("D:\\11.txt"),"GBK");
  5.                 OutputStreamWriter osw=new OutputStreamWriter(
  6.                                 new FileOutputStream("D:\\22.txt"),"GBK");
  7.                 int num1=0;
  8.                 while((num1=isr.read())!=-1){
  9.                         System.out.println("整数"+num1);
  10.                         System.out.println("二进制"+Integer.toBinaryString(num1));
  11.                         osw.write(num1);
  12.                         
  13.                 }
  14.                 System.out.println("-----------------------------------");
  15.                
  16.                 InputStreamReader isr1=new InputStreamReader(
  17.                                 new FileInputStream("D:\\44.txt"),"UTF-8");
  18.                 OutputStreamWriter osw1=new OutputStreamWriter(
  19.                                 new FileOutputStream("D:\\55.txt"),"UTF-8");
  20.                
  21.         
  22.                 int num11=0;
  23.                 while((num11=isr1.read())!=-1){
  24.                         System.out.println("整数"+num11);
  25.                         System.out.println("二进制"+Integer.toBinaryString(num11));
  26.                         osw1.write(num11);
  27.                         
  28.                 }        
  29.                
  30.                 System.out.println("-----------------------------------");
  31.                
  32.                 InputStreamReader isr2=new InputStreamReader(
  33.                                 new FileInputStream("D:\\66.txt"),"Unicode");
  34.                 OutputStreamWriter osw2=new OutputStreamWriter(
  35.                                 new FileOutputStream("D:\\77.txt"),"Unicode");
  36.                
  37.         
  38.                 int num12=0;
  39.                 while((num12=isr2.read())!=-1){
  40.                         System.out.println("整数"+num12);
  41.                         System.out.println("二进制"+Integer.toBinaryString(num12));
  42.                         osw2.write(num12);
复制代码
嗯,通过这个可以知道得到的是UNICODE,因为都说JAVA内部char String 都是unicode保存的嘛,api文档中char 数据类型(和 Character 对象封装的值)基于原始的 Unicode 规范,将字符定义为固定宽度的 16 位实体,String 表示一个 UTF-16 格式的字符串。


但是我又不知道他怎么查的表,除了第一个流是直接取出那个原始字节,第二个包括我后面加的流,都是用指定编码读取然后转化成相同的内部字符,拿个“阿”来说,得到的都是38463,对应10110000 10100010。说他是UNICODE码,但是你用,比如String s="阿"  把s.getByte(“unicode”)又得不出10110000 10100010这个来哦。所以我不知道他查表,得出这个38463的

评分

参与人数 1黑马币 +3 收起 理由
黄玉昆 + 3 赞一个!

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马