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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 黑马-刘昌文 中级黑马   /  2012-4-10 16:49  /  1760 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

为什么在写入单个字符的时候 write(int c),c为什么是int类型的,按我想应该是char类型的才对嘛?谁给我解释哈

4 个回复

正序浏览
因为有可能会读到连续8个二进制1的情况,8个二进制1对应的十进制是-1.
那么就会数据还没有读完,就结束的情况。因为我们判断读取结束是通过结尾标记-1来确定的。
所以,为了避免这种情况将读到的字节进行int类型的提升。
并在保留原字节数据的情况前面了补了24个0,变成了int类型的数值。


而在写入数据时,只写该int类型数据的最低8位。
回复 使用道具 举报
续楼上:毕老师说 FileReader是包装了 InputStreamReader 流,但是InputStreamReader 读取的字符,如果已到达流的末尾,则返回 -1 。如果读取单个char值为-1的字符,那么误认为结束标记,这是个漏洞。所以返回int就是将其值进行类型提升,那么char值为-1的字符提升后就不再是-1,又考虑到效率,(提升的越少,那么单位数据越短,效率越高),读取之后write()的时候会进行强转还原。就是这样,理解的不好还望谅解。
回复 使用道具 举报
write(int c),int read()操作的都是字符编码表对应的数字。任何数据在内存中都是以二进制数存在的。
回复 使用道具 举报
write(int b)
将指定的字节写入此输出流。write 的常规协定是:向输出流写入一个字节。要写入的字节是参数 b 的八个低位。b 的 24 个高位将被忽略。
write(byte[] b)
将 b.length 个字节从指定的字节数组写入此输出流。write(b) 的常规协定是:应该与调用 write(b, 0, b.length) 的效果完全相同。

评分

参与人数 1技术分 +1 收起 理由
岳民喜 + 1

查看全部评分

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