黑马程序员技术交流社区
标题:
变量!!问题,困扰很久。(但示例是用流问题举例的)
[打印本页]
作者:
龚正军
时间:
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