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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 蔡园园 黑马帝   /  2011-9-11 10:52  /  2543 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

比如 is是个字节流对象,调用is.read()返回的数据本可以用字节接受,即byte b = is.read(),但却用一个整数来接受,即int b= is.read();这里蕴含了什么奥秘吗?
[ 本帖最后由 蔡园园 于 2011-09-11  12:02 编辑 ]

6 个回复

倒序浏览
黑马网友  发表于 2011-9-11 10:54:32
沙发

回复 楼主 的帖子

问题再说的明白些
回复 使用道具 举报
黑马网友  发表于 2011-9-11 12:25:31
藤椅
public abstract int read()
                  throws IOException
API中的定义:从输入流中读取数据的下一个字节。返回 0 到 255 范围内的 int 字节值。如果因为已经到达流末尾而没有可用的字节,则返回值 -1。在输入数据可用、检测到流末尾或者抛出异常前,此方法一直阻塞。

为什么,字节读取流的read方法一次读一个字节,返回值类型,不是byte,而是int呢?
    那是因为,在读取一个字节数据时,容易出现连续8个1的情况,连续8个1是-1.
    正好符合了流结束标记。所以为了避免,流操作数据是提前结束,
    将读到的字节进行int类型的提升。保留该字节数据的同时,前面都补0.避免-1的情况。:)

评分

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

查看全部评分

回复 使用道具 举报

回复 藤椅 的帖子

如果按整型接受,那读到的数据永远都表示不了-1了,那么永远也结束不了啊。那么请问代表结尾的-1是怎么表示的?如果要代表结束,最后读取应该是用字节来接收啊。
[ 本帖最后由 蔡园园 于 2011-09-11  12:51 编辑 ]

评分

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

查看全部评分

回复 使用道具 举报
黑马网友  发表于 2011-9-11 14:21:45
报纸
怎么可能永远结束不了呢,读到结尾时read()方法就会返回-1,不要问我为什么返回-1,是怎么返回的,问read()吧,其实这个问题在毕老师的基础教程中的io流部分有讲到,其实就是文涛说的那种情况,详细的建议去看毕老师的教程。

评分

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

查看全部评分

回复 使用道具 举报
黑马网友  发表于 2011-9-11 14:22:56
地板
为什么int不能表示-1呢?
回复 使用道具 举报
黑马网友  发表于 2011-9-11 16:44:14
7#
这是设计的原因,会涉及到一些深层的问题。
因为java传递基本类型永远是按照“按值传递”,char也是基本类型,即使你把一个char类型传进方法中,这个值也在方法外也不会改变。
除了基本类型,java是”按引用传递“,数组是一个”引用“,传进方法能被方法体改变值,而且即使在方法体外也是被编写后的值。[code]public class PassValue {

        char a = 'e';
        char[] b = {'a','b'};
       
        public void initial()
        {
                System.out.println("初始char a="+ a);
                System.out.println("初始char b[] ="+ b[0]+ b[1]);
        }
       
       
        public void changeVal (char c)
        {
               
                c = 'a';
                System.out.println("方法体内的字符(基本类型)char a="+ c);
        }
        public void changeRef(char[] h)
        {
               
                h[0]='c';
                h[1]='d';
                System.out.println ("方法体内的数组(引用类型)char[] b="+h[0]+h[1]);
               
        }
       
       
        public void change()
        {
                changeVal(a);
                System.out.println("方法体外的字符char a=" + a);
                changeRef(b);
                System.out.println("方法体外的数组char[] b=" + b[0] + b[1]);
               
        }
       
        public static void main (String args[])
        {
                PassValue v = new PassValue();
                v.initial();
                v.change();
               
        }
}[/code]输出[code]初始char a=e
初始char b[] =ab
方法体内的字符(基本类型)char a=a
方法体外的字符char a=e
方法体内的数组(引用类型)char[] b=cd
方法体外的数组char[] b=cd[/code]

评分

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

查看全部评分

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