黑马程序员技术交流社区

标题: 字节流读取小细节 [打印本页]

作者: 蔡园园    时间: 2011-9-11 10:52
标题: 字节流读取小细节
比如 is是个字节流对象,调用is.read()返回的数据本可以用字节接受,即byte b = is.read(),但却用一个整数来接受,即int b= is.read();这里蕴含了什么奥秘吗?
[ 本帖最后由 蔡园园 于 2011-09-11  12:02 编辑 ]
作者: 匿名    时间: 2011-9-11 10:54
标题: 回复 楼主 的帖子
问题再说的明白些
作者: 匿名    时间: 2011-9-11 12:25
public abstract int read()
                  throws IOException
API中的定义:从输入流中读取数据的下一个字节。返回 0 到 255 范围内的 int 字节值。如果因为已经到达流末尾而没有可用的字节,则返回值 -1。在输入数据可用、检测到流末尾或者抛出异常前,此方法一直阻塞。

为什么,字节读取流的read方法一次读一个字节,返回值类型,不是byte,而是int呢?
    那是因为,在读取一个字节数据时,容易出现连续8个1的情况,连续8个1是-1.
    正好符合了流结束标记。所以为了避免,流操作数据是提前结束,
    将读到的字节进行int类型的提升。保留该字节数据的同时,前面都补0.避免-1的情况。:)
作者: 蔡园园    时间: 2011-9-11 12:50
标题: 回复 藤椅 的帖子
如果按整型接受,那读到的数据永远都表示不了-1了,那么永远也结束不了啊。那么请问代表结尾的-1是怎么表示的?如果要代表结束,最后读取应该是用字节来接收啊。
[ 本帖最后由 蔡园园 于 2011-09-11  12:51 编辑 ]
作者: 匿名    时间: 2011-9-11 14:21
怎么可能永远结束不了呢,读到结尾时read()方法就会返回-1,不要问我为什么返回-1,是怎么返回的,问read()吧,其实这个问题在毕老师的基础教程中的io流部分有讲到,其实就是文涛说的那种情况,详细的建议去看毕老师的教程。
作者: 匿名    时间: 2011-9-11 14:22
为什么int不能表示-1呢?
作者: 匿名    时间: 2011-9-11 16:44
这是设计的原因,会涉及到一些深层的问题。
因为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]




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