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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 庄承荣 黑马帝   /  2011-11-2 00:16  /  2020 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

和大家分享一下今天视频学习中提到的一个问题:字节流对象如InputStream中的read()方法,为何返回的是 int 类型 ,而不是 byte 类型 ?

5 个回复

倒序浏览
qy 来自手机 黑马帝 2011-11-2 00:26:47
沙发
因为在硬盘读取内容时,是一个字符一个字符读取的。返回的是读取的个数

评分

参与人数 1技术分 +1 收起 理由
宁超 + 1 赞一个!

查看全部评分

回复 使用道具 举报
read方法 int read();输入流调用read方法顺序的读取源中的单个字节数据,该方法返回字节值(0~255之间的一个整数)
read方法的另外两个形式:int read(byte b[]),int read(byte[],int off,int len)这俩个形式都能使程序把多个字节读到一个字节数组中,第一个方法将试图从文件读取b.length个字节,并将读取的字节存放在数组b中,第二个方法试图读取len个字节。这两个read方法都返回实际读取的字节个数!

评分

参与人数 1技术分 +2 收起 理由
宁超 + 2 赞一个!

查看全部评分

回复 使用道具 举报
read()是返回读取的字节数,方法的返回值是一个整数!

评分

参与人数 1技术分 +1 收起 理由
宁超 + 1 貌似是其中一种

查看全部评分

回复 使用道具 举报
假如读取的数据为二进制形式的“11111111”,那么int类型的值将会把最后一个字节的8位填充为“11111111”,其他24个高位全部用“0”补充,那么它的值是255,如果返回值是byte类型的话,那么“11111111”的值表示十进制的-1,这时就跟read()读到流的末尾时返回的-1是有冲突的。这个返回值跟强制转换是不一样的。byte b = -1;  //这时他的二进制形式是“11111111”;强制转换到int类型的值的话,其他24个高位将会全部用“1”填充,也就是32位的“1”来表示-1。

评分

参与人数 1技术分 +1 收起 理由
宁超 + 1 赞一个!

查看全部评分

回复 使用道具 举报
这是因为读取的有可能不光是文本文件,还可能读取像图片或者影音之类的媒体,读取的字节就可能全部位上都是连续的1,值也就是-1,但是这时候还没到文件末尾,判断条件判断到这时候就会退出。
那么可以把读取的字节提升成一个int型,但是提升后的还是一个-1,这是因为把int数的前24位也赋值成了1,就可以把读取的int数与操作上一个255,因为读取的就是后8位,把前24屏蔽掉就好了

评分

参与人数 1技术分 +1 收起 理由
宁超 + 1 赞一个!

查看全部评分

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