黑马程序员技术交流社区

标题: 变量!!问题,困扰很久。(但示例是用流问题举例的) [打印本页]

作者: 龚正军    时间: 2012-5-7 18:17
标题: 变量!!问题,困扰很久。(但示例是用流问题举例的)
先说明下,示例不是变量,但是真正的问题确实是变量的问题!此问题困扰我很久了,希望能得到我能懂的解释和详细的过程解释!!

首先假定: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

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


作者: 周四川    时间: 2012-5-7 18:29
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?


作者: 蒋映辉    时间: 2012-5-7 18:30
fr.read()会使读取的指针后移,  你在while语句里边就向后移了一位,输出的时候又向后移了一位  所以a就被跳过,就是b了
后面的方法,仔细对比一下  指针移动以后 存到变量里去  然后输出变量 所以是对的
作者: 龚正军    时间: 2012-5-7 18:42
啊~~~~~~~~~~~明白了,原来如果不赋值给变量的话,方法(fr,read();)本身会出现重复执行的问题,我就这么没想到这点喃!!

天啊。。。。。你别说就这小问题,出现在很多地方,我还真没想到方法被重复执行的问题,之前一直纠结在此~~~哈哈,豁然开朗啊!!谢谢楼上同学了。{:soso_e102:}哪儿可以弄得把帖子已解决啊,论坛很不熟悉,少上!,有知道的没。
作者: 隋营营    时间: 2012-5-7 18:51
先分析这一段:
                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)就不循环了,所以不会出现上面的情况!


作者: 韩慧阳    时间: 2012-5-7 18:54
每次调用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了?
作者: 龚正军    时间: 2012-5-7 18:59
谁知道哪儿吧帖子修改成:已解决??谁知道,告诉下!
作者: 韩慧阳    时间: 2012-5-7 19:00
楼主给点分嘛!!
作者: 蒋映辉    时间: 2012-5-7 19:01
韩慧阳 发表于 2012-5-7 19:00
楼主给点分嘛!!

楼主给的分是金钱  没用   但是楼主又给不了技术分  你去把版主或者老师叫来给技术分嘛
作者: 韩慧阳    时间: 2012-5-7 19:11
我也好想,哈哈!!!   
作者: 龚正军    时间: 2012-5-7 19:21
韩慧阳 发表于 2012-5-7 19:00
楼主给点分嘛!!

技术分会有的,面包也会有的,那东西,只有版主给,我只能给你金钱,但是金钱我都不知道怎么给。
汗~~~~~~~~~~~~~~~~~~~
作者: xiwangliujiao    时间: 2012-5-7 20:33
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了?




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2