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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 黑马李杰 中级黑马   /  2013-4-8 17:39  /  1375 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

自从学了IO就一直不明白一个问题,虽然会写.
FileReader fr = new FileReader("test.txt");
int ch = 0;
while((ch=fr.read())=-1) {
    System.out.println(char(ch));
}
这个程序的ch到底是读的什么啊?是字符长度还是字符的Ascii啊,怎么还能用char强转啊

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

5 个回复

倒序浏览
ch没读啊,是定义一个容器存储由fr.read读取出来的字符二进制数据啊!!!-1嘛你应该明白吧!代表读完这一行!!!至于为什么强转。因为你读取的字符数据都有相对应的编码表进行解析!解析后的东西用int型不能装啊!因为解析出来的东西已经不是数字了,可能是字母,可能是文字,也可能是其他的东西!就算有数字!也按照字符形式输出!

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

回复 使用道具 举报
你好,
当你用Int型变量接收时,这个变量(ch)就暂存是的一个int型的数。 这个数是取出内容对应是编码号。   编码表中最大的编码号也就是占三个字节,转成10进制用int型装是可以的。

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 郭彦君 于 2013-4-8 18:48 编辑

这个问题你得看清楚read()这个方法,他读取到的是单个字符,会转成二进制作为返回值,返回值是int型的,如果这个int值是-1的话,代表已经读完。
你在if里用这个int值作为条件来判断是否读完,也就是说这个int值只要不等于-1,就一直读。
定义个ch就是为了接受这个值,方便操作。

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

回复 使用道具 举报
其实这个方法每个类中是不同的

比如,你说的这个FileReader,在这个类中,这个read方法读出来的ch就是int行的Ascii,需要转换一下.

如果是一个流的话,读出来的就是二进制数据的值.

在实际的软件开发中,大家一般习惯定义一个byte[] 数组或者char[]数据去接受数据,这样的话,会调用一个read(byte[]或者char[])的方法,这个方法返回的就是读了多少的字节数据或者字符数据.

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

回复 使用道具 举报
public int read()
         throws IOException读取单个字符。在字符可用、发生 I/O 错误或者已到达流的末尾前,此方法一直阻塞。
用于支持高效的单字符输入的子类应重写此方法。


返回:
作为整数读取的字符,范围在 0 到 65535 之间 (0x00-0xffff),如果已到达流的末尾,则返回 -1
抛出:
IOException - 如果发生 I/O 错误

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

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