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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

先说明下,示例不是变量,但是真正的问题确实是变量的问题!此问题困扰我很久了,希望能得到我能懂的解释和详细的过程解释!!

首先假定:abc.txt文件里面存放的内容是abc

import java.io.*;

class ReaderDemo
{
        public static void main(String[] args) throws IOException
        {
                FileReader fr=new FileReader("abc.txt");
               
                while (fr.read()!=-1)
                {
                        System.out.println((char)fr.read());
                }
        }
}
结果是:b?

import java.io.*;

class ReaderDemo
{
        public static void main(String[] args) throws IOException
        {
                FileReader fr=new FileReader("abc.txt");
                int ch=0;
                while ((ch=fr.read())!=-1)
                {
                        System.out.println((char)ch);
                }
        }
}
结果是正确的abc

问题:两者这么出现的问题究竟出现在什么地方?并且该如何分析。  在设置变量和不设置变量上运行中差别发生在哪儿??

评分

参与人数 1技术分 +1 收起 理由
攻城狮 + 1 赞一个!

查看全部评分

11 个回复

倒序浏览
class ReaderDemo
{
        public static void main(String[] args) throws IOException
        {
                FileReader fr=new FileReader("abc.txt");
               
                while (fr.read()!=-1) //当第一次执行到此处  此时read 读取到a这个字符的ASCII码 //然后第三次执行read方法 读取到c的ASCII码
                {
                        System.out.println((char)fr.read()); //接下来又调用了read方法,往下读取到b的ASCII码,然后转换成字符b   //然后第四次执行read方法,此时文本结尾,所以读取不到字符,然后强转为char类型,则出现了 ?  这个东东
                }
        }
}
结果是:b?

评分

参与人数 1技术分 +1 收起 理由
攻城狮 + 1 赞一个!

查看全部评分

回复 使用道具 举报
fr.read()会使读取的指针后移,  你在while语句里边就向后移了一位,输出的时候又向后移了一位  所以a就被跳过,就是b了
后面的方法,仔细对比一下  指针移动以后 存到变量里去  然后输出变量 所以是对的

评分

参与人数 1技术分 +1 收起 理由
攻城狮 + 1 赞一个!

查看全部评分

回复 使用道具 举报
啊~~~~~~~~~~~明白了,原来如果不赋值给变量的话,方法(fr,read();)本身会出现重复执行的问题,我就这么没想到这点喃!!

天啊。。。。。你别说就这小问题,出现在很多地方,我还真没想到方法被重复执行的问题,之前一直纠结在此~~~哈哈,豁然开朗啊!!谢谢楼上同学了。{:soso_e102:}哪儿可以弄得把帖子已解决啊,论坛很不熟悉,少上!,有知道的没。
回复 使用道具 举报
先分析这一段:
                while (fr.read()!=-1)
                {
                        System.out.println((char)fr.read());
                }
当执行红色的read()时读取了字符 a,不输出。
执行蓝色read()时读取字符 b,打印输出。
红色的read()继续执行,读取字符 c,不输出。
继续执行蓝色read(),此时已经读到文件末尾,操作系统有一个标记文件结尾的字符,好像是Ctrl + z,读取后不能转换成字符,所以显示

而这种方法:
                 while ((ch=fr.read())!=-1)
                {
                        System.out.println((char)ch);
                }
检测到已经讲到文件尾(read()返回-1)就不循环了,所以不会出现上面的情况!

评分

参与人数 1技术分 +1 收起 理由
攻城狮 + 1 赞一个!

查看全部评分

回复 使用道具 举报
每次调用read()指针都会想后移动一次的。在使用read()方法时,在每次读取之前指针会先移动到下一个内存单元。比如在读取b之前,指针先是移动到c位置,然后再读取b。那么当读取c时指针会移动到c后面的一个单元,然后再读取c。
下面走一遍循环:
第一次,指针指向的是a。当执行到while (fr.read()!=-1)时,指针先指向b,然后读取a。
        接着执行System.out.println((char)fr.read());其中又一个fr.read(),那么指针会先移动到c,然后读取b,那么自然输出b了。
第二次,当执行while (fr.read()!=-1)时,指针移动到c的下一个位置,然后读取c,判断是c的ASCII码,所以满足。
        接着执行System.out.println((char)fr.read());指针先移动,那么就是c后面的第二个位置了,所以输出的是‘?’。
第三次,判断时条件自然不满足,所以跳出。
当你定义一个ch时候,输出中没有用read(),所以输出正确。  OK了?

评分

参与人数 1技术分 +1 收起 理由
攻城狮 + 1 加油哦···黑马见

查看全部评分

回复 使用道具 举报
谁知道哪儿吧帖子修改成:已解决??谁知道,告诉下!
回复 使用道具 举报
楼主给点分嘛!!
回复 使用道具 举报
韩慧阳 发表于 2012-5-7 19:00
楼主给点分嘛!!

楼主给的分是金钱  没用   但是楼主又给不了技术分  你去把版主或者老师叫来给技术分嘛
回复 使用道具 举报
我也好想,哈哈!!!   
回复 使用道具 举报
韩慧阳 发表于 2012-5-7 19:00
楼主给点分嘛!!

技术分会有的,面包也会有的,那东西,只有版主给,我只能给你金钱,但是金钱我都不知道怎么给。
汗~~~~~~~~~~~~~~~~~~~
回复 使用道具 举报
fr.read()会使读取的指针后移,  你在while语句里边就向后移了一位,输出的时候又向后移了一位  所以a就被跳过,就是b了
后面的方法,仔细对比一下  指针移动以后 存到变量里去  然后输出变量 所以是对的

每次调用read()指针都会想后移动一次的。在使用read()方法时,在每次读取之前指针会先移动到下一个内存单元。比如在读取b之前,指针先是移动到c位置,然后再读取b。那么当读取c时指针会移动到c后面的一个单元,然后再读取c。
下面走一遍循环:
第一次,指针指向的是a。当执行到while (fr.read()!=-1)时,指针先指向b,然后读取a。
         接着执行System.out.println((char)fr.read());其中又一个fr.read(),那么指针会先移动到c,然后读取b,那么自然输出b了。
第二次,当执行while (fr.read()!=-1)时,指针移动到c的下一个位置,然后读取c,判断是c的ASCII码,所以满足。
         接着执行System.out.println((char)fr.read());指针先移动,那么就是c后面的第二个位置了,所以输出的是‘?’。
第三次,判断时条件自然不满足,所以跳出。
当你定义一个ch时候,输出中没有用read(),所以输出正确。  OK了?
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马