黑马程序员技术交流社区

标题: 结果为什么不是想象的值? [打印本页]

作者: yangyinhui    时间: 2013-4-5 18:48
标题: 结果为什么不是想象的值?
本帖最后由 yangyinhui 于 2013-4-5 19:41 编辑
  1. private static void demo1() throws FileNotFoundException, IOException {
  2.         FileOutputStream fos = new FileOutputStream("data.txt");
  3.         fos.write(2333);                // byte
  4.         fos.write(232);
  5.         fos.write(393);
  6.         fos.close();
  7.         
  8.         FileInputStream fis = new FileInputStream("data.txt");
  9.         System.out.println(fis.read());
  10.         System.out.println(fis.read());
  11.         System.out.println(fis.read());
  12.         fis.close();
  13. }

  14. }
  15. 结果为什么不是:           2333
  16.                           232
  17.                           393
  18.   
  19.   
  20.   输出结果是                 29
  21.                           232
  22.                           137
  23.    

复制代码

作者: 徐升2013    时间: 2013-4-5 19:07
本帖最后由 徐升2013 于 2013-4-5 19:13 编辑

int a = 2333;
                byte b = (byte)a;
                System.out.println(b);

你在程序中加上这两句话就明白了~!~

你在使用Write方法时调用的是参数类型为int的write方法。
而你在读的时候是调用的读取下一字节的read方法。存入的是int类型 ,取出的时候是byte类型,强制转换的结果之后就是这个样子了 。


作者: whs_nk    时间: 2013-4-5 19:19
FileOutputStream是字节流,fos.write()写入的只是一个字节大小的数据,无符号数的表示范围为0到255,而393和2333明显超过了这个范围。这里就拿2333来说吧,二进制表示为1000,0001,1101低八位为0001,1101,正好是29,存入的是29,不是2333,所以取出的就是29咯,393同理可以分析。希望能帮到你哦
作者: 随便    时间: 2013-4-5 19:30
正如楼上所说的,int强转byte型,要丢失24位二进制数。

作者: 杜加璇    时间: 2013-4-5 19:37
FileInputStream,FileOutputStream是字节流,读写时,每次读写的是一个字节的数据,字节数据是0-255之间的数,在这个范围内的数读写是不会不改变的233没有超过255所以输出结果还是233但是如果超过255程序也只会读写这个数二进制的后八位所以2333输出结果是29,393输出结果是137。
作者: yangyinhui    时间: 2013-4-5 19:41
知道了,谢谢




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2