黑马程序员技术交流社区
标题:
字节流读取小细节
[打印本页]
作者:
蔡园园
时间:
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