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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 Super_Class 于 2013-6-20 23:53 编辑

  1. <P>import java.io.*;
  2. import java.util.*;

  3. class Demo
  4. {
  5.       public static void main(String[] args) throws IOException
  6.       {

  7.             OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("111.txt"),"GBK");
  8.             InputStreamReader isr = new InputStreamReader(new FileInputStream("111.txt"),"GBK");
  9.             osw.write("你好");
  10.             osw.flush();
  11.            
  12.             System.out.println(isr.read()); //打印结果是20320

  13.             osw.close();
  14.              isr.close();
  15.         }
  16. }</P>
  17. <P>我很疑惑一点:isr.read()方法是怎样将字符 "你" 字转成int型数据的,"你"字分两个字节,第一个字节是11000100( -60 ), 第二个字节是11100011(-29),这俩字节放一块就是11000100 11100011,这个二进制位提升成int型:00000000 0000000 11000100 11100011 转成十进制也应该是50403,为何打印出来的结果却是20320,这是怎么得来的???  

  18. </P>
复制代码

评分

参与人数 1技术分 +1 收起 理由
Super_Class + 1

查看全部评分

9 个回复

倒序浏览
原因是你那里指定了GBK编码而各自编码顺序不同所以结果就不同了
回复 使用道具 举报
姚志远 发表于 2013-6-20 03:17
原因是你那里指定了GBK编码而各自编码顺序不同所以结果就不同了

不是很懂,能否请稍微说的详细一些?
回复 使用道具 举报
FileReder 和 FileInputStream 分别是以字符和字节的形式来完成数据的读取的,然而返回值确是 int 类型的数据,这样做的核心目的只是要取到到一个 int 类型下的 -1 来表示数据流的末尾。

评分

参与人数 1技术分 +1 收起 理由
Super_Class + 1

查看全部评分

回复 使用道具 举报
张承富 发表于 2013-6-20 11:40
FileReder 和 FileInputStream 分别是以字符和字节的形式来完成数据的读取的,然而返回值确是 int 类型的数 ...

好吧,我知道返回值为int型的目的,是为了避免出现的-1不是我们想要的。
我只是疑惑,为何打印出来的结果是 20320,而不是50403 ...
回复 使用道具 举报


API里面讲的很清楚啊!!!楼主不细心啊

评分

参与人数 1技术分 +1 收起 理由
Super_Class + 1

查看全部评分

回复 使用道具 举报
杨政 中级黑马 2013-6-20 13:56:04
7#
20320貌似是“你”所对应的Unicode码十进制值{:soso_e132:},为什么会这样?
回复 使用道具 举报
万琪 发表于 2013-6-20 13:30
API里面讲的很清楚啊!!!楼主不细心啊

你明白了我想表达的意思了吗?你肯定没有认真看完帖子,我的意思不是说为何会返回一个int值,我明白返回值为什么会是int型,只是觉得,返回值不应是20320,而应该是50403,我算出来的,应该是50403!
好吧,可能我这帖子名字起得有点问题...
回复 使用道具 举报
黎志文 发表于 2013-6-20 14:24
你明白了我想表达的意思了吗?你肯定没有认真看完帖子,我的意思不是说为何会返回一个int值,我明白返回 ...

楼主他是一次只读一个的啊!
回复 使用道具 举报
还是不懂{:2_43:}
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马